【问题标题】:Mocking methods in JestJest 中的模拟方法
【发布时间】:2016-11-07 11:17:26
【问题描述】:

我有一个非常简单的单元测试,如下所示:

import ApiWrapper from '../../services/api_wrapper';
jest.unmock('../helper')

describe('Helper', () => {
    let Helper;

    beforeEach(() => {
        Helper = require('../helper').default;
    });

    it('calls the Api Wrapper', () => {
        Helper.help()

        expect(ApiWrapper.help).toHaveBeenCalled();
    });

});

Helper 看起来像这样:

import ApiWrapper from '../services/api_wrapper'
class Helper {
    help() {
        ApiWrapper.help()
    }
}

export default new Helper();

而 ApiWrapper 看起来像这样:

class ApiWrapper {
  static help () {
     console.log('help!')
  }
}
export default ApiWrapper;

ApiWrapper.help() 被 Jest 嘲笑,所以“救命!”永远不会被打印出来,但测试中的期望失败了。如果我们将 ApiWrapper 重写为像这样的普通 Javascript 对象,这仍然会失败:

export default {
    help: () => { console.log('help!'); }
}

但是,如果我们更改规范中的导入(因此在 beforeEach 中导入 ApiWrapper),并将 ApiWrapper 重写为 Singleton 类,则它可以工作,如下所示:

class ApiWrapper {
   help() {
      console.log('help!');
   }
}();

export default new ApiWrapper();

Jest 的嘲弄行为是什么导致了这种情况发生?

【问题讨论】:

标签: unit-testing reactjs flux jestjs


【解决方案1】:

如果将require('../helper').default; 移到beforeEach() 之外,是否有效?

您不需要在每次测试之前对其进行初始化。但是,我会将ApiWrapper.help.mockClear() 放入beforeEach() 以重置模拟呼叫。

【讨论】:

    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 2020-03-31
    相关资源
    最近更新 更多