【发布时间】: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 的嘲弄行为是什么导致了这种情况发生?
【问题讨论】:
-
更多信息在这个问题的线程中:github.com/facebook/jest/issues/1245
标签: unit-testing reactjs flux jestjs