如何在生成器中测试无限循环?

时间:2019-12-04 15:54:38

标签: javascript jestjs sinon redux-saga

背景

我正在尝试编写一个传奇来处理某个视图打开时的轮询,并且我想在视图关闭时取消轮询。这几乎是文档中的textbook example!在为此编写测试的过程中,我遇到了以下问题。

问题

当我引入延迟并尝试使用假计时器模拟延迟时,生成器在第二个循环中没有yield,并且测试失败。但是,代码将记录loop 0loop 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();
  });
});



0 个答案:

没有答案