Mock.mockImplementation()不起作用

Jan*_*nos 19 jestjs

我有一个服务类

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 遇到了同样的问题,其他答案也没有帮助。你可以做两件事:

  1. 如果您只需要模拟来自 Service 的函数,请在您的测试文件中:

    import service from './Service';
    
    jest.mock('./Service', () => jest.fn());
    
    service.yourFunction = jest.fn(() => { /*your mock*/ })
    
    Run Code Online (Sandbox Code Playgroud)

     

  2. 如果您需要模拟整个模块:

    假设你的 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)

    ...从模拟文件导出的函数将通过您的测试文件执行。

  • 这就是问题的实际答案。投票最多的并没有解决不是功能问题。 (2认同)

Hen*_*rik 8

遇到了类似的问题并使用 .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)

  • 这不起作用,提问者明确提到它不起作用。 (3认同)
  • 这也不起作用。在这种情况下 service.mockImplementation 甚至不存在。 (2认同)