Angular 2+, асинхронное тестирование и setTimeout - PullRequest
0 голосов
/ 24 июня 2018

У меня есть вопрос по поводу тестирования.Я использую Angular 6, карму и жасмин.

Мой тест:

it(`my test`, async(() => {
    console.log('### start test');
    fixture.detectChanges();
    // call a method which has async code
    fixture.componentInstance.fakeTimeout();
    console.log('isStable', fixture.isStable());
    fixture.whenStable().then(() => {
        // here I must check smth only when all async operations are completed
        console.log('### end test');
    });
}));

Я пытался реализовать метод fakeTimeout различными способами, а именно:

public fakeTimeout() {
    new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log('>>>>>> COMPONENT TIMEOUT!!!');
            resolve(true);
        }, 2000);
    }).then(() => {});
}

или

public fakeTimeout() {
    setTimeout(() => {
        console.log('>>>>>> COMPONENT TIMEOUT!!!');
    }, 2000);
}

В обоих случаях у меня был следующий журнал:

### start test
isStable true
### end test
>>>>>> COMPONENT TIMEOUT!!!

Но, согласно официальной документации, обещание whenStable разрешает только тогда все асинхронные операциизавершены, и журнал должен быть:

### start test
isStable true
>>>>>> COMPONENT TIMEOUT!!!
### end test

Что я сделал не так?Как правильно написать асинхронный тест при условии, что я должен дождаться завершения всех асинхронных операций в моем компоненте?

1 Ответ

0 голосов
/ 24 июня 2018

Не уверен, почему fixture.whenStable() не ждет самого delay (setTimeout).

Но это нормально работает с нормальным Promise или Observable return

Но вы можете решить это одним из способов:

Метод 1 : Вы можете ждать вручную, используя tick(), используя fakeAync

it(`my test`, fakeAsync(() => {
    console.log('### start test');
    fixture.detectChanges();
    // call a method which has async code
    fixture.componentInstance.fakeTimeout();
    tick(2100); // just more than the delay mentioned inside the component.
    console.log('isStable', fixture.isStable());
    fixture.whenStable().then(() => {
        // here I must check smth only when all async operations are completed
        console.log('### end test');
    });
}));

Метод 2 : У вас есть собственный setTimeout внутри файла спецификации и выполните тест, используя done()

it(`my test`, ((done) => {
        console.log('### start test');
        fixture.detectChanges();
        // call a method which has async code
        fixture.componentInstance.fakeTimeout();
        setTimeout(()=> {
          console.log('isStable', fixture.isStable());
          console.log('### end test');
          done();
        },2100)
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...