【发布时间】:2020-05-26 08:58:49
【问题描述】:
我遇到了一个问题,即 jest 没有在测试之间清除状态。我尝试在beforeEach() 和afterEach() 中调用restoreAllMocks(),但这并没有清除我的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。我没想到会这样,因为这意味着间谍状态在测试之间泄漏。
如何防止 jest 在测试之间泄漏状态?
【问题讨论】:
标签: javascript unit-testing testing jestjs