config.json
內的 database 設定{
"development": {
"username": "root",
"password": "password",
"database": "ac_twitter_workspace",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "root",
"password": "password",
"database": "ac_twitter_workspace_test",
"host": "127.0.0.1",
"dialect": "mysql",
"logging": false
},
const chai = require('chai')
const request = require('supertest')
const sinon = require('sinon')
const app = require('../../app')
const helpers = require('../../_helpers');
const should = chai.should();
const expect = chai.expect;
const db = require('../../models')
const passport = require('../../config/passport')
// admin 相關功能測試
// 1. 管理者可以看見站內所有的使用者
// 2. 管理者可以刪除使用者的推文
describe('# admin requests', () => {
context('# GET ', () => {
describe(' /api/admin/users', () => {
before(async() => {
// 清除 User table 的測試資料庫資料
await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true });
await db.User.destroy({where: {},truncate: true, force: true})
await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, { raw: true });
// 模擬登入資料
const rootUser = await db.User.create({name: 'root'});this.authenticate = sinon.stub(passport,"authenticate").callsFake((strategy, options, callback) => {
callback(null, {...rootUser}, null);
return (req,res,next)=>{};
});
this.getUser = sinon.stub(
helpers, 'getUser'
).returns({id: 1, Followings: [], role: 'admin'});
// 在測試資料庫中,新增 mock 資料
await db.User.create({account: 'User1', name: 'User1', email: 'User1', password: 'User1', role: 'admin'})
await db.User.create({account: 'User2', name: 'User2', email: 'User2', password: 'User2'})
})
// GET /admin/users - 看見站內所有的使用者
it(' - successfully', (done) => {
request(app)
.get('/api/admin/users')
.set('Accept', 'application/json')
.expect(200)
.end(function(err, res) {
if (err) return done(err);
// 檢查回傳資料是否是陣列類型
expect(res.body).to.be.an('array');
// 檢查回傳資料是否有 3 筆使用者資料
res.body.length.should.equal(3);
return done();
})
});
after(async () => {
// 清除登入及測試資料庫資料
this.authenticate.restore();
this.getUser.restore();
await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true });
await db.User.destroy({where: {},truncate: true, force: true})
await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, { raw: true });
})
});
});
context('# DELETE ', () => {
describe(' /api/admin/tweets/:id', () => {
before(async() => {
// 清除 User, Tweet table 的測試資料庫資料
await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true });
await db.User.destroy({where: {},truncate: true, force: true})
await db.Tweet.destroy({where: {},truncate: true, force: true})
await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, { raw: true });
// 模擬登入資料
const rootUser = await db.User.create({name: 'root'});this.authenticate = sinon.stub(passport,"authenticate").callsFake((strategy, options, callback) => {
callback(null, {...rootUser}, null);
return (req,res,next)=>{};
});
this.getUser = sinon.stub(
helpers, 'getUser'
).returns({id: 1, Followings: [], role: 'admin'});
// 在測試資料庫中,新增 mock 資料
await db.User.create({account: 'User1', name: 'User1', email: 'User1', password: 'User1', role: 'admin'})
await db.User.create({account: 'User2', name: 'User2', email: 'User2', password: 'User2'})
await db.Tweet.create({UserId: 1, description: 'User1 的 description'})
})
// DELETE /admin/tweets/:id - 刪除使用者的推文
it(' - successfully', (done) => {
request(app)
.delete('/api/admin/tweets/1')
.set('Accept', 'application/json')
.expect(200)
.end(function(err, res) {
if (err) return done(err);
// 檢查是否 Tweet table 中的資料是空的,表示有刪除成功
db.Tweet.findByPk(1).then(tweet => {
expect(tweet).to.be.null
return done();
})
})
});
after(async () => {
// 清除登入及測試資料庫資料
this.authenticate.restore();
this.getUser.restore();
await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 0', null, { raw: true });
await db.User.destroy({where: {},truncate: true, force: true})
await db.Tweet.destroy({where: {},truncate: true, force: true})
await db.sequelize.query('SET FOREIGN_KEY_CHECKS = 1', null, { raw: true });
})
});
});
});
config.json
內的設定問題,但發現測試環境下設定的資料庫名稱,跟開發環境的資料庫名稱不一樣,照理來說不應該把開發環境的資料刪除先檢查你的資料庫連線組態是用哪個
const db = require('../../models') 裡面加上 console.log('XXXXX 印出你的 資料庫連線組態. ')
執行時檢查一下
看你的 程式 用到 config.json 哪一個? 切換組態(從 env 判斷用 config.json 哪個 組態) 那部分的程式應該是在有用到 dotnev 套件的地方 July 30, 2022 3:53 PM (GMT+8)ㄐ