Угловое тестирование: tick не может увеличить время таймеров за пределами своей собственной зоны fakeAsync

#angular #testing

#angular #тестирование

Вопрос:

Все примеры, которые я нашел до сих пор tick() , связаны с тем, что таймер находится в одном и том же fakeAsync .

Подумайте, что у вас есть какая-то инициализация, которая включает setTimeout в себя, и вы хотели бы ввести ее beforeEach() и продвинуть часы в it() . Я не могу сделать это, используя только angular: (

Пожалуйста, взгляните на приведенные ниже примеры. Для простоты «инициализация» состоит из простого setTiemout . Любые советы или более глубокие объяснения tick неправильного поведения и, если есть способ его преодолеть, будут высоко оценены.

Это всегда терпит неудачу, вообще не может увеличить время:

 describe("counter1", () => {
        let counter = 0;
        beforeEach(() => {
            setTimeout(()=>   counter, 10);
        });
        it("is incremented", fakeAsync(() => {
            expect(counter).toBe(0); // TRUE
            tick(50);
            expect(counter).toBe(1);  // FALSE; tick() can not advance the timer when it is outside the current fakeAsync
        }));
    });
 

Это похоже на приведенное выше, но, кроме того, есть Error: 1 timer(s) still in the queue. то, от чего я не могу избавиться из fakeAsync -за beforeEach

     describe("counter1fakeAsync" , () => {
        let counter = 0;
        beforeEach(fakeAsync(() => {
            setTimeout(()=>   counter, 10);
        }));
        it("is incremented", fakeAsync(() => {
            expect(counter).toBe(0); // TRUE
            tick(50);
            expect(counter).toBe(1);  // FALSE; tick() can not advance the timer when it is outside the current fakeAsync
            // Even more you cannot get rid of `Error: 1 timer(s) still in the queue.`
        }));
    });
 

Это работает, все примеры в Интернете выглядят так:

     describe("counter2",  () => {
        let counter = 0;
        it("is incremented", fakeAsync(() => {
            setTimeout(()=>   counter, 10);
            expect(counter).toBe(0); // TRUE
            tick(50);
            expect(counter).toBe(1);  // TRUE; tick() can advance the timer if it is in the same fakeAsync
        }));
    });
 

jasmine.clock() также работает:

     describe("counter3",  () => {
        let counter = 0;
        beforeEach(() => {
            jasmine.clock().uninstall(); // NEEDED :( or try with __zone_symbol__fakeAsyncPatchLock
            jasmine.clock().install();
            setTimeout(()=>   counter, 10);
        });
        afterEach(() => {
            jasmine.clock().uninstall();
        });
        it("is incremented", () => {
            expect(counter).toBe(0); // TRUE
            jasmine.clock().tick(50);
            expect(counter).toBe(1);  // TRUE; jasmine.clock().tick() just works as expected
        });
    });