Я добавил тестовое покрытие к существующему коду и недавно несколько раз сталкивался с шаблоном, который испытывал трудности с тестированием.
Учитывая некоторые существующие методы, такие как:
public foo(): void {
SomeResource.get().then((someResource) => {
someOtherMethod(someResource);
});
}
И мне нужно проверить, что someOtherMethod вызывается с правильным параметром. Наивно, я бы сделал что-то вроде:
it("gets called", () => {
spyOn(SomeResource, "get").and.returnValue(Promise.resolve(someTestValue));
spyOn(someOtherMethod);
foo();
expect(someOtherMethod).toHaveBeenCalledWith(someTestValue);
});
Но из того, что я понимаю, потому что someOtherMethod находится ниже по потоку чего-то асинхронного c (даже насмешливо) Я не гарантирую, что он будет вызван когда мое spe c достигнет ожидаемого уровня - у меня будет ложный тест.
Вместо этого я немного изменил тестируемый метод, чтобы вернуть обещание:
public foo(): Promise(void) {
return SomeResource.get().then((someResource) => {
someOtherMethod(someResource);
});
}
, который затем позволяет мне проверить это следующим образом:
it("gets called", (done) => {
spyOn(SomeResource, "get").and.returnValue(Promise.resolve(someTestValue));
spyOn(someOtherMethod);
foo().then(() => {
expect(someOtherMethod).toHaveBeenCalledWith(someTestValue);
done();
})
});
Но у меня есть две проблемы:
- Не очень хорошо изменение тестируемого метода (и его подписи!) для единственной выгоды моих тестов
- Иногда невозможно вернуть цепочку обещаний
Есть ли лучший способ проверить цепочки обещаний с жасмином? Способ, который не требует, чтобы функция возвращала обещание для меня, чтобы ждать?