模拟实现后取消模拟功能

时间:2020-09-08 20:58:30

标签: node.js jestjs

我无法在模拟功能时遇到麻烦。

我首先模拟它,现在我不能取消模拟

//myClass.js
class myClass {

    static check(v1,v2) {
        return v1 > v2;
    }

    static async getinfo(v1,v2) {
        if (this.check(v1,v2)) {
            return await get('api.google.com');
        }
        return [];
    }
}


//myclass.spec.js
describe('Testing myClass', () => {
    describe('testing processing', () => {
        it('should return result', () => {
              const mockPatch = jest.fn().mockImplementation((version, solution) => false);
              myClass.check = mockCheck;
              try {
                const result = await myClass.getinfo(1,2);
                expect(result).toBe.([]);
              }catch(e) {
                throw e;
              }
        })
    })
    describe('Testing check', () => {
        it('should return true', () => {
            expect(myClass.check(2,1)).toBe.true
        })
    })
})

我已经尝试过

myClass.check.mockRestore()

beforeEach(() => {myClass.check.mockRestore()})

jest.unmock('./myClass.js)

反正我可以解决这个问题吗?我读了所有开玩笑的文件,却找不到任何东西

2 个答案:

答案 0 :(得分:2)

永远不要通过重新分配方法来嘲笑方法,Jest无法以这种方式恢复其原始实现。

这应该始终通过spyOn完成:

jest.spyOn(myClass, 'check').mockReturnValue(false)

这样,可以使用restoreMockrestoreAllMocks恢复方法。最好在Jest configuration中全局启用此功能。

答案 1 :(得分:0)

我假设您希望做的是模拟在特定测试中使用的实现,但是在不进行模拟的情况下让其他测试起作用。

如果是这样,我想您可以将module mocking strategymockReturnValueOnce结合使用。

请确保在测试的顶部导入模块,然后使用相同的路径调用jest.mock。之后,您应该可以调用myClass.check.mockReturnValueOnce,并且它将被模拟,直到下次调用它为止。之后,它将正常运行normally