Тестирование методов 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!!
});