Как издеваться над задержкой с помощью sinon? - PullRequest
0 голосов
/ 09 мая 2020

У меня есть метод в службе, который требует выждать 5000 мс перед возвратом. Мне нужно провести модульное тестирование этого метода. Я хочу имитировать задержку, используя sinon fakeTimers, потому что я не хочу, чтобы весь модульный тест действительно ждал 5000 мс. Но у меня 2 проблемы.

1) Тест зависает, как только использую sinon fakeTimers. Я ищу способ установить отметку 5000 мс, когда код достигнет линии задержки.

2) Как мне «подтвердить», что значение возвращается точно через 5000 мс, а не 4999 мс, а не 5001 мс? (это вообще возможно?)

class MyService {
    async doSomething(){

        await this.delay(5000)
        return 'Done'
    }
    delay(millis: number) {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve();
            }, millis);
        });
    }
}
describe('My Service', ()=>{
    it('should return done after 5s',async ()=>{
        const clock  = sinon.useFakeTimers(0)
        clock.tick(5000)
        const service = new MyService()
        const ans = await service.doSomething()
        expect(ans).to.equal('Done')
    })
})

1 Ответ

0 голосов
/ 11 мая 2020

Вы можете проверить Как тестировать асинхронные c функции с поддельными таймерами do c для получения дополнительной информации. Вот решение:

service.js:

class MyService {
  async doSomething() {
    await this.delay(5000);
    return 'Done';
  }
  delay(millis: number) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve();
      }, millis);
    });
  }
}

export { MyService };

service.test.js:

import { MyService } from './service';
import sinon from 'sinon';
import { expect } from 'chai';

describe('61695981', () => {
  let clock;
  before(() => {
    clock = sinon.useFakeTimers();
  });

  after(() => {
    clock.restore();
  });

  it('should pass', async () => {
    const service = new MyService();
    const ansPromise = service.doSomething();
    clock.tick(5000);
    const ans = await ansPromise;
    expect(ans).to.equal('Done');
  });
});

результаты модульного тестирования со 100% покрытием:

  61695981
    ✓ should pass


  1 passing (15ms)

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