我遇到一个问题,即开玩笑没有在测试之间清除状态。我尝试在restoreAllMocks()
和beforeEach()
中调用afterEach()
,但这并没有清除我的jest.spyOn(x, 'y').mockImplementation()
存根。我也尝试过clearAllMocks()
和resetAllMocks()
,但不走运。
我的规格模块:
function mockFeatureFlag(flagToMock: Flag) {
jest.spyOn(FeatureFlags, 'singleton').mockImplementation(
() =>
({
getFeatureFlag: (flag: Flag) =>
new Promise(resolve => {
if (flag === flagToMock) {
resolve(true);
} else {
resolve(false);
}
}),
} as any),
);
}
describe('bufferMinutesForDistance', () => {
it('for small distances uses min buffer of 3h', async () => {
const minutes = await util.bufferMinutesForDistance(1);
expect(minutes).toBe(3 * 60);
});
it('for small distances when HALF_GHOST_BUFFER flag is true uses min buffer of 3h', async () => {
mockFeatureFlag(Flag.HALF_GHOST_BUFFER);
const minutes = await util.bufferMinutesForDistance(1);
expect(minutes).toBe(3 * 60);
});
it('for long distances uses 12h buffer', async () => {
const minutes = await util.bufferMinutesForDistance(1000);
expect(minutes).toBe(12 * 60);
});
it('for long distances when HALF_GHOST_BUFFER flag is true cuts 12h buffer by half', async () => {
mockFeatureFlag(Flag.HALF_GHOST_BUFFER);
const minutes = await util.bufferMinutesForDistance(1000);
expect(minutes).toBe(6 * 60);
});
});
这里有4个测试。在测试1和3中,我没有明确模拟功能标志返回true,我希望它返回false(默认情况下功能标志为false)。在这里,我调用mockImplementation
以使功能标志在测试2中返回true。但是,在运行测试时,我看到该标志在测试3中也返回true。我没想到这一点,因为这意味着两次测试之间的间谍状态正在泄漏。
如何防止笑话在测试之间泄漏状态?
答案 0 :(得分:0)
这是Jest中的一个未解决的问题(潜在错误):https://github.com/facebook/jest/issues/7083
默认情况下,Jest在两次测试之间不会清除间谍状态。它们可以单独地,在创建它们的测试中/之后显式删除,也可以更改您的玩笑配置以自动清除测试之间的间谍状态。可以在jest.config.js
中设置以下属性,以告知Jest清除测试之间的状态:
restoreMocks: true,
clearMocks: true,
resetMocks: true,