我正在尝试编写一个传奇来处理某个视图打开时的轮询,并且我想在视图关闭时取消轮询。这几乎是文档中的textbook example!在为此编写测试的过程中,我遇到了以下问题。
当我引入延迟并尝试使用假计时器模拟延迟时,生成器在第二个循环中没有yield
,并且测试失败。但是,代码将记录loop 0
和loop 1
,因此我知道它是第二次进入循环。
如果我使用真正的延迟,则测试通过!
这是预期的吗?我会失去主意吗?
import { runSaga } from "redux-saga";
import { call, delay } from "redux-saga/effects";
import sinon from "sinon";
describe("faking the delay", () => {
it("should loop more than once", async () => {
let i = 0;
const clock = sinon.useFakeTimers();
const spy = jest.fn().mockReturnValue(true);
function* loop() {
while (true) {
console.log("loop %d", i);
yield call(spy);
// yield delay(1);
yield new Promise(resolve => setTimeout(resolve, 1));
i++;
}
}
await runSaga({}, loop, spy);
expect(spy).toBeCalledTimes(1);
// await new Promise(resolve => setTimeout(resolve, 1));
clock.tick(1)
clock.tick(1)
expect(spy).toBeCalledTimes(2); // FAILS
clock.restore();
});
});