如何在类中存根必需的模块?

问题描述 投票:0回答:1

我有一个使用不希望实际调用的数据库的类。深入研究后,发现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');
      });
});
node.js unit-testing chai sinon
1个回答
0
投票

我不确定,但很有趣。如果重写缓存怎么办?

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');
      });
});
© www.soinside.com 2019 - 2024. All rights reserved.