我在尝试在 Jest 中模拟静态类方法时遇到了问题。 是否支持这种行为?
交叉发布在http://stackoverflow.com/questions/38206478/mocking-methods-in-jest
我有一个非常简单的单元测试,如下所示:
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!'); }
}
但是,如果我们更改规范中的导入(因此 ApiWrapper 在 beforeEach 中导入),并且将 ApiWrapper 重写为单例类,它会起作用,如下所示:
class ApiWrapper {
help() {
console.log('help!');
}
}();
export default new ApiWrapper();
是什么让 Jest 的嘲笑行为导致了这种情况?
正确的断言应该是toBeCalled
。 你可以试试吗?
对不起,这就是我的意思。 我直接在 Stackoverflow 中输入了示例。
Jest 会在每次调用it
重置模块注册表。 您需要顶部的ApiWrapper
和 beforeEach 内部的Helper
,因此 Helper 可能会收到ApiWrapper
的不同副本。 要修复它,您可以:
beforeEach
两个类简化说明:
var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.
如果这不能解决您的问题,请告诉我。
最有用的评论
Jest 会在每次调用
it
重置模块注册表。 您需要顶部的ApiWrapper
和 beforeEach 内部的Helper
,因此 Helper 可能会收到ApiWrapper
的不同副本。 要修复它,您可以:beforeEach
两个类简化说明:
如果这不能解决您的问题,请告诉我。