我正在尝试模拟一个函数,并在测试之后将真正的实现用于其他测试。
const myService = () => {
return {
foo: () => return 1;
}
}const myService = require('./myService.js');
jest.mock('./myService');
describe('testing myService', () => {
it('should return 2 by mocked', () => {
myService.mockImplementation(() => ({
foo: jest.fn().mockResolvedValueOnce(2),
}));
expect.assertions(1);
expect(myService().foo()).toBe(2);
jest.restoreAllMocks();
});
it('should return 1', () => {
expect(myService().foo()).toBe(1);
});
});但是在这之后,foo()仍然被嘲笑。
发布于 2021-07-21 11:25:40
jest.spyOn(object, methodName)是为对象创建模拟方法的更好选择。
我们可以通过在afterEach()钩子中使用jest.restoreAllMocks()来将该方法恢复到原始实现。
请注意,仅当使用
jest.spyOn创建模拟时,jest.restoreAllMocks()才有效;其他模拟将需要您手动恢复它们。
例如。
myService.js
const myService = () => {
return {
foo: () => 1,
};
};
module.exports = myService;myService.test.js
const myService = require('./myService.js');
describe('testing myService', () => {
afterEach(() => {
jest.restoreAllMocks();
});
it('should return 2 by mocked', () => {
const service = myService();
jest.spyOn(service, 'foo').mockReturnValueOnce(2);
expect(service.foo()).toBe(2);
expect(service.foo).toBeCalledTimes(1);
});
it('should return 1', () => {
const service = myService();
expect(jest.isMockFunction(service.foo)).toBeFalsy();
expect(service.foo()).toBe(1);
});
});测试结果:
PASS examples/68459394/myService.test.js (8.465 s)
testing myService
✓ should return 2 by mocked (3 ms)
✓ should return 1
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 9.548 shttps://stackoverflow.com/questions/68459394
复制相似问题