如何在玩笑中重置间谍或模拟

时间:2020-06-23 08:21:39

标签: reactjs unit-testing jestjs react-testing-library spy

我在测试用例文件中有一个模拟的函数。

MyService.getConfigsForEntity = jest.fn().mockReturnValue(
    new Promise(resolve => {
        let response = [];
        resolve(response);
    })
);

现在,我希望我在该文件中的所有测试用例都可以使用这种模拟方式

describe('Should render Component Page', () => {
    it('should call the API', async () => {
        const {container} = render(<MyComp entityName='entity1'/>);
        await wait(() => expect(MyService.getConfigsForEntity).toHaveBeenCalled());
    });
});

唯一的问题是我只想用不同的方式模拟返回值的一个测试用例。

但是之前和之后的所有其他测试用例都可以使用全局模拟。

describe('Should call API on link click', () => {
    it('should call the API on link click', async () => {
       const spy = jest.spyOn(MyService, 'getConfigsForEntity ').mockReturnValue(
           new Promise(resolve => {
           let response = [{
               "itemName": "Dummy"
           }];
           resolve(response);
        });
        const {container} = render(<MyComp entityName='entity1'/>);
        await wait(() => expect(spy).toHaveBeenCalled());
        spy.mockClear();
    });
});

问题是,一旦我在一个测试用例中对函数进行了不同的模拟,该测试用例之后的其他所有使用全局模拟的测试用例都会失败,

但是仅当我将测试用例放在所有其他测试用例之后时,它才起作用。

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用mockRestore()

beforeEach(() => {
  spy.mockRestore();
});

答案 1 :(得分:0)

您尝试过吗?

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