【问题标题】:Mocking an object constructor call with Jest用 Jest 模拟对象构造函数调用
【发布时间】:2020-07-29 11:56:32
【问题描述】:

我有这样的代码,我想在更改之前进行测试,但是当控制器调用 new dao() 时我无法模拟。

//controller.js
const dao = require('./dao');

exports.callDAOProcess = () => {
  ...
  const result = new dao().getProcess();
  ...
  return result;
};

//dao.js
function dao() {
    model = require('./model');
}

dao.prototype.getProcess = function() {
    return model.getModelProcess();
}

module.exports = dao;

//model.js
exports.getModelProcess = function () {
    return 'process';
}

我可以在测试 dao.js 时模拟 getProcess,但是当我测试控制器时,我得到了真正的 getProcess 方法。我怎么能嘲笑它? 这是我预期的测试:mock 并收到:process

test('Testing mock::', () => {
    const dao = require('./dao');
    jest.mock('./dao', () => jest.fn());

    dao.getProcess = jest.fn(() => ('mock'));

    const result = controller.callDAOProcess();
    expect(result).toBe('mock');
});

【问题讨论】:

    标签: javascript node.js unit-testing mocking jestjs


    【解决方案1】:

    jest.mock() 方法应该在功能范围内使用。它应该在模块范围内使用。

    例如

    controller.js:

    const dao = require('./dao');
    
    exports.callDAOProcess = () => {
      const result = new dao().getProcess();
      return result;
    };
    

    dao.js:

    function dao() {
      this.model = require('./model');
    }
    
    dao.prototype.getProcess = function () {
      return this.model.getModelProcess();
    };
    

    controller.test.js:

    const dao = require('./dao');
    const controller = require('./controller');
    
    jest.mock('./dao', () => {
      const mDao = { getProcess: jest.fn() };
      return jest.fn(() => mDao);
    });
    
    describe('63144781', () => {
      test('Testing mock::', () => {
        const daoIns = new dao();
        daoIns.getProcess.mockReturnValueOnce('mock');
        const result = controller.callDAOProcess();
        expect(result).toBe('mock');
      });
    });
    

    带有覆盖率报告的单元测试结果:

     PASS  stackoverflow/63144781/controller.test.js (10.615s)
      63144781
        ✓ Testing mock:: (4ms)
    
    ---------------|---------|----------|---------|---------|-------------------
    File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
    ---------------|---------|----------|---------|---------|-------------------
    All files      |     100 |      100 |     100 |     100 |                   
     controller.js |     100 |      100 |     100 |     100 |                   
    ---------------|---------|----------|---------|---------|-------------------
    Test Suites: 1 passed, 1 total
    Tests:       1 passed, 1 total
    Snapshots:   0 total
    Time:        11.868s
    

    【讨论】:

    • 不,jest.mock 可以在本地范围内使用。但是开发人员需要了解使其按预期工作所需的条件。它没有被提升,所有依赖它的模块都应该重新导入。
    • @EstusFlask 您需要在功能范围内使用jest.doMock(moduleName, factory, options)
    • 它的工作方式与函数内部的 jest.mock 相同,只需多按 3 次按键即可输入。我想它可以推荐用于预期提升内部功能的情况(就像 OP 所做的那样)。
    猜你喜欢
    • 2020-01-08
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2019-05-25
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多