我有一个服务类
Service.js
class Service {
}
export default new Service();
Run Code Online (Sandbox Code Playgroud)
我正在尝试为此提供模拟实现.如果我使用这样的东西:
jest.mock('./Service', () => { ... my mock stuff });
Run Code Online (Sandbox Code Playgroud)
它工作正常,但是我无法访问在mock之外声明的任何变量,这有点限制,因为我想重新配置mock返回的内容等.
我试过这个(受其他StackOverflow文章的启发:使用Jest模拟的服务导致"jest.mock()的模块工厂不允许引用任何超出范围的变量"错误)
import service from './Service';
jest.mock('./Service', () => jest.fn);
service.mockImplementation(() => {
return { ... mock stuff }
);
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我试图运行它时,我得到以下错误:
TypeError: _Service2.default.mockImplementation is not a function
Run Code Online (Sandbox Code Playgroud)
小智 21
我和@Janos 遇到了同样的问题,其他答案也没有帮助。你可以做两件事:
如果您只需要模拟来自 Service 的函数,请在您的测试文件中:
import service from './Service';
jest.mock('./Service', () => jest.fn());
service.yourFunction = jest.fn(() => { /*your mock*/ })
Run Code Online (Sandbox Code Playgroud)
如果您需要模拟整个模块:
假设你的 service.js 在 javascript/utils 中,创建一个 javascript/utils/_ mocks _ 并在其中创建一个 service.js 文件,然后你可以在这个文件中模拟整个类,例如:
const myObj = {foo: "bar"}
const myFunction1 = jest.fn(() => { return Promise.resolve(myObj) })
const myFunction2 = ...
module.exports = {
myFunction1,
myFunction2
}
Run Code Online (Sandbox Code Playgroud)
然后在您的测试文件中添加:
jest.mock('./javascript/utils/service')
Run Code Online (Sandbox Code Playgroud)
...从模拟文件导出的函数将通过您的测试文件执行。
遇到了类似的问题并使用 .mockImplementationOnce 解决了它
jest.mock('./Service', () => jest.fn()
.mockImplementationOnce(() => {
return { ... mock stuff }
})
.mockImplementationOnce(() => {
return { ... mock other stuff }
})
);
Run Code Online (Sandbox Code Playgroud)
现在,当您运行另一个测试时,它将返回第二个模拟对象。
小智 7
模拟等于jest.fn. 您需要调用jest.fn来创建一个模拟函数.
所以这:
jest.mock('./Service', () => jest.fn);
Run Code Online (Sandbox Code Playgroud)
应该:
jest.mock('./Service', () => jest.fn());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5723 次 |
| 最近记录: |