Тестирование методов async (Promise) в Angular 2 Сервисы

Это интересная проблема: я пытаюсь протестировать Сервис, который использует Ionic BarcodeScanner. У меня есть репо, основанный на ионном модульном тестовом репозитории для тестирования. Я издеваюсь над методом BarcodeScanner.scan через spyOn(..).and.callFake(..)

Проблема: он работает, когда я вызываю метод сканирования из компонента. Он выдает тайм-аут, когда я делаю то же самое в службе.

Код проверки компонентов:

it("should be able to set a spy on the scanner and test the component", done => {
    const testBC = "123456";
    const spy = spyOn(TestBed.get(BarcodeScanner), "scan");
    spy.and.callFake(() => {
        return new Promise((resolve, reject) => {
            resolve(testBC);
        })
    });

        component.testScanner().then(res => {
            expect(res).toBe(testBC);
            done();
        }, reason => {
            expect(true).toBe(false);
            done();
        })
});

Сервисный тестовый код:

it("should be able to set a spy on the scanner and test the service", done => {
    const testBC = "123456";
    const spy = spyOn(TestBed.get(BarcodeScanner), "scan");
    spy.and.callFake(() => {
        return new Promise((resolve, reject) => {
            resolve(testBC);
        })
    });

    inject([TestService], (service) => {
        service.testScanner().then(res => {
            expect(res).not.toBe(testBC);
            done()
        }, reason => {
            expect(true).toBe(false);
            done();
        })
    })
});

Существует ли какая-либо известная проблема тестирования сервисов в Angular 2? Любая помощь ценится!

Ответы

Ответ 1

Проблема заключалась в том, чтобы не вызвать функцию инъекции.

Код проверки для службы теперь выглядит следующим образом:

it("should be able to set a spy on the scanner and test the service", done => {
    const testBC = "123456";
    const spy = spyOn(TestBed.get(BarcodeScanner), "scan");
    spy.and.callFake(() => {
        return new Promise((resolve, reject) => {
            resolve(testBC);
        })
    });

    inject([TestService], (service) => {
        service.testScanner().then(res => {
            expect(res).not.toBe(testBC);
            done()
        }, reason => {
            expect(true).toBe(false);
            done(); 
        })
    })(); //<-- do not forget these braces!!
});