我有个服务班
Service.js
class Service {
}
export default new Service();
我试着提供一个模拟的实现。如果我使用这样的代码:
jest.mock('./Service', () => { ... my mock stuff });
它工作正常,但是我不能访问在mock之外声明的任何变量,这有点限制,因为我想重新配置mock返回的内容,等等。
我尝试了这个(灵感来自另一篇StackOverflow文章:Service mocked with Jest causes "The module factory of jest.mock() is not allowed to reference any out-of-scope variables" error)
import service from './Service';
jest.mock('./Service', () => jest.fn);
service.mockImplementation(() => {
return { ... mock stuff }
);
不幸的是,当我试图运行这个,我得到下面的错误:
TypeError: _Service2.default.mockImplementation is not a function
6条答案
按热度按时间wj8zmpe11#
我和@Janos有同样的问题,其他的答案也没有帮助。你可以做两件事:
1.如果只需要模拟Service中的函数,请在测试文件中:
1.如果需要模拟整个模块:
假设您的service.js位于javascript/utils中,创建一个javascript/utils/_mocks_并在其中创建一个service.js文件,然后您可以在此文件中模拟整个类,例如:
然后在测试文件中添加:
...从模拟文件导出的函数将在测试文件执行过程中被执行。
qxsslcnc2#
mock等同于jest.fn。您需要调用jest.fn来创建一个mock函数。
所以这个:
应为:
qni6mghb3#
遇到类似问题,使用
.mockImplementationOnce
解决了该问题现在,当你运行另一个测试时,它将返回第二个模拟对象。
rxztt3cl4#
您需要将模拟组件存储在一个名称以“mock”为前缀的变量中,并确保在从“main.js”文件中的默认值导入服务时返回一个具有默认属性的对象。
euoag5mw5#
我遇到过类似的问题,原因是“. spec.js”文件有一个
去掉这条线后,它起作用了。
0md85ypi6#
我的错误在于我在每次测试之前都要重新设置模拟。如果你这样做了,一定要重新配置模拟实现。
例如,更改以下内容:
改为: