Jest.js mock.mockImplementation()无法工作

laawzig2  于 2023-01-22  发布在  Jest
关注(0)|答案(6)|浏览(254)

我有个服务班
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
wj8zmpe1

wj8zmpe11#

我和@Janos有同样的问题,其他的答案也没有帮助。你可以做两件事:
1.如果只需要模拟Service中的函数,请在测试文件中:

import service from './Service';

jest.mock('./Service', () => jest.fn());

service.yourFunction = jest.fn(() => { /*your mock*/ })

1.如果需要模拟整个模块:
假设您的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
}

然后在测试文件中添加:

jest.mock('./javascript/utils/service')

...从模拟文件导出的函数将在测试文件执行过程中被执行。

qxsslcnc

qxsslcnc2#

mock等同于jest.fn。您需要调用jest.fn来创建一个mock函数。
所以这个:

jest.mock('./Service', () => jest.fn);

应为:

jest.mock('./Service', () => jest.fn());
qni6mghb

qni6mghb3#

遇到类似问题,使用.mockImplementationOnce解决了该问题

jest.mock('./Service', () => jest.fn()
  .mockImplementationOnce(() => {
    return { ... mock stuff }
  })
  .mockImplementationOnce(() => {
   return { ... mock other stuff }
  })
);

现在,当你运行另一个测试时,它将返回第二个模拟对象。

rxztt3cl

rxztt3cl4#

您需要将模拟组件存储在一个名称以“mock”为前缀的变量中,并确保在从“main.js”文件中的默认值导入服务时返回一个具有默认属性的对象。

// Service.js
class Service {
}
export default new Service();

// main.test.js (main.js contains "import Service from './Service';")

const mockService = () => jest.fn();

jest.mock('./Service', () => {
    return {
        default: mockService
    }
});
euoag5mw

euoag5mw5#

我遇到过类似的问题,原因是“. spec.js”文件有一个

import jest from "jest-mock";

去掉这条线后,它起作用了。

0md85ypi

0md85ypi6#

我的错误在于我在每次测试之前都要重新设置模拟。如果你这样做了,一定要重新配置模拟实现。
例如,更改以下内容:

let value;
  let onPropertyChange: OnPropertyChangeCallback = jest.fn((changes: any) => {
      value = changes["testValue"];
    });

  const user = userEvent.setup();

  beforeEach(() => {
    jest.resetAllMocks();
  });

改为:

let value;
  let onPropertyChange: OnPropertyChangeCallback;

  const user = userEvent.setup();

  beforeEach(() => {
    jest.resetAllMocks();

    onPropertyChange = jest.fn((changes: any) => {
      value = changes["testValue"];
    });
  });

相关问题