我有一个使用不希望实际调用的数据库的类。深入研究后,发现Sinon似乎可以解决内部方法的此问题,但无法使其与所需的模块一起使用。我知道该测试目前执行不多,但是我想确认自己可以继续进行此操作。
当我执行以下操作时,数据库没有被存根。
我要测试的代码如下:
const db = require('../../models');
const Op = db.Sequelize;
class UserSearch{
async _resolveUserType(userType){
let permission;
if (typeof userType === 'number'){
permission = await db.permission.findOne({ where: { id : userType } });
}else{
permission = await db.permission.findOne({ where: { type : userType } });
}
return permission;
}
}
测试代码:
const db = require('../../models');
const { UserSearch } = require('./userSearch');
describe('UserSearch Test Suite', function(){
it('should return an object', async function(){
const fakeDb = {
permission: {
findOne: function () {
return new Promise(resolve => {
return resolve({id: 3, type: 'student'})
});
}
}
};
const userSearch = new UserSearch();
sinon.stub(db, 'permission').returns(fakeDb.permission);
const permission = await userSearch._resolveUserType(3);
expect(permission).to.be.an('object');
});
});
我不确定,但很有趣。如果重写缓存怎么办?
const { UserSearch } = require('./userSearch');
describe('UserSearch Test Suite', function(){
it('should return an object', async function(){
require.cache[require.resolve('../../models')].exports = {
permission: {
findOne: function () {
return new Promise(resolve => {
return resolve({id: 3, type: 'student'})
});
}
}
};
const userSearch = new UserSearch();
const permission = await userSearch._resolveUserType(3);
expect(permission).to.be.an('object');
});
});