Тестирование связанного обещания с использованием Jasmine без возврата обещания - PullRequest
0 голосов
/ 16 апреля 2020

Я добавил тестовое покрытие к существующему коду и недавно несколько раз сталкивался с шаблоном, который испытывал трудности с тестированием.

Учитывая некоторые существующие методы, такие как:

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();
    })
});

Но у меня есть две проблемы:

  1. Не очень хорошо изменение тестируемого метода (и его подписи!) для единственной выгоды моих тестов
  2. Иногда невозможно вернуть цепочку обещаний

Есть ли лучший способ проверить цепочки обещаний с жасмином? Способ, который не требует, чтобы функция возвращала обещание для меня, чтобы ждать?

1 Ответ

0 голосов
/ 17 апреля 2020

Попробуйте это:

it("gets called", async done => {
    spyOn(SomeResource, "get").and.returnValue(Promise.resolve(someTestValue));
    spyOn(someOtherMethod);
    // call foo
    foo();
    // before going to your assertion, ensure the pending promise has resolved
    await SomeResource.get();
    // ok, pending promise has resolved, carry on with the assertion
    expect(someOtherMethod).toHaveBeenCalledWith(someTestValue);
    done();
}); 
...