Избегайте асинхронного кода от прогона beign после завершения теста - PullRequest
0 голосов
/ 14 февраля 2020

Наш набор тестов Jasmine становится все более ненадежным из-за асинхронного кода, выполняемого после завершения теста.

Пример:

код:

@Component
export class MyComponent {

  doSomething() {
    setTimeout(() => {
      somethingThatThrowsOnTest();
    }, 5000);
  }
}

тест:

it('should do something', () => {
  component.doSomething(); <-- Doesnt fail because the exception isn't thrown during the test.
});

Как избежать подобных проблем?

Я сделал стек с этой проблемой: https://stackblitz.com/edit/jasmine-fail-afterall?file=app%2Fapp.component.spec.ts

Он пройдет все тесты а затем выдать ошибку.

1 Ответ

1 голос
/ 14 февраля 2020

Мне нравится использовать async(done) и ждать выполнения обещаний, прежде чем их утверждать.

  it('should do something', async(done) => {
    // given
    const { comp, el, fixture } = setup();

    // when
    fixture.detectChanges();
    comp.doSomethingAsync(); // Trigger asynchronous code
    await fixture.whenStable();
    // your assertions
    done();
  });

Однако в вашем случае, поскольку вы используете setTimeout из 5 с, вы можете сохранить 5 секунд, используя fakeAsync и tick. Тик подделывает время.

  it('should do something', fakeAsync(() => {
    // given
    const { comp, el, fixture } = setup();

    // when
    fixture.detectChanges();
    comp.doSomethingAsync(); // Trigger asynchronous code
    tick(5000);              // Make 5 seconds pass instantaneously
    // your assertions
  }));

================================ ============ Теперь вы говорите, чтобы не запускать код asynchronous после завершения теста. Может быть, вы можете сделать:

  // wait for the promises to resolve before going to the next it test
  afterEach(async(done) => { await fixture.whenStable(); done(); });

Если они setTimeout, я бы очистил тайм-ауты в ngOnDestroy, чтобы они не преследовали вас в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...