简体   繁体   中英

Sinon , recursion and setTimeout

I looked through stackoverflow for this question, but seems like majority of the questions cover two out of the three, and most people don't have a need to use all three.

This is the code snippet. I am trying to have testA to recursively call itself after a certain timeout.

const testA = async () => {
  setTimeout(() => {
    testA();
  }, 1000);
  return;
};

Here's my test code:

//test.js
const someThing = require("../tester.js");
const chai = require("chai");
const sinonChai = require("sinon-chai");
const sinon = require("sinon");
chai.use(sinonChai);

describe("Test A", () => {
  it("Should call twice", () => {
    const clock = sinon.useFakeTimers();
    const testASpy = sinon.spy(someThing, "testA");

    testASpy();
    chai.expect(testASpy).to.have.been.calledOnce; //is fine
    clock.tick(1000);
    chai.expect(testASpy).to.have.been.calledTwice; //fails
  });
});

I keep seeing everyone saying "Sinon cannot stub a standalone function" but I can't find out why. If someone could point me to the direction of reading more about it, I'd really like to see that. At the same time if anyone knows a work around to make this work, I'd love to know more as well. Thanks again!

Your code does not make sense. It will cause infinite loop. Here is the unit test solution:

index.ts :

export const testA = async () => {
  setTimeout(() => {
    console.count("testA");
    testA();
  }, 1000);
};

index.spec.ts :

import * as mod from "./";
import sinon from "sinon";
import { expect } from "chai";

describe("58843454", () => {
  it("should pass", async () => {
    const clock = sinon.useFakeTimers();
    const testASpy = sinon.spy(mod, "testA");
    await testASpy();
    expect(testASpy.calledOnce).to.be.true;
    clock.tick(1000);
    expect(testASpy.calledTwice).to.be.true;
  });
});

Unit test result with 100% coverage:

 58843454
testA: 1
    ✓ should pass


  1 passing (16ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |      100 |      100 |      100 |      100 |                   |
 index.spec.ts |      100 |      100 |      100 |      100 |                   |
 index.ts      |      100 |      100 |      100 |      100 |                   |
---------------|----------|----------|----------|----------|-------------------|

Source code: https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/58843454

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM