Должна ли функция, вызывающая обещание и ничего не возвращающая, считаться ошибкой? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть один метод, который выглядит так:

doSomething(){
     return somethingPromisy().then((blerp) => {
         // do something with blerp
         return blerp;  // Modified, of course
     });
};

Тогда у меня есть другой метод, который выглядит следующим образом:

doSomethingElse(){
    stepOne();
    var x = stepTwo();
    var y = stepThree(x);
    doSomething.then((data) => {
        stepFour(data + y);
    });
};

Я использую mocha + chai + sinon для тестирования этого кода, в частности, doSomethingElse, и затем я хочу сделать некоторые утверждения - но как я могу гарантировать, что обещание будет выполнено к тому времени, когда я сделаю утверждения ? Я знаю, что один вариант будет изменить его на:

doSomethingElse(){
    /* ... */
    return doSomething.then(...);
};

Если я сделаю это, то довольно легко написать мой тест, потому что тогда:

return doSomethingElse().then(() => {
    someFake.lastCall.args.should.deep.equal(expectedData);
});

В моем тесте все нормально. Но должен ли я возвращать обещание просто ради возвращения обещания? На самом деле не заботится о каком-либо виде возвращаемого значения из doSomethingElse - меня волнует только то, что когда я проверяю, была вызвана функция в doSomething.then, то есть обещание doSomething было разрешено ко времени, когда я делаю свои утверждения.

Так, каков "лучший" способ пойти по этому поводу?

1 Ответ

0 голосов
/ 17 сентября 2018

Вы должны тестировать doSomething и doSomethingElse отдельно с помощью doSomethingElse, используя макет doSomething, с поддельным и затем метаданным, который может вернуть ваше значение для тестирования. Вы в основном хотите проверить их отдельно, а не одновременно. В этом случае вы в основном объединяете doSomething и doSomethingElse, что затрудняет тестирование. Тестирование должно быть простым, вы не тестируете, чтобы увидеть, работают ли обещания, поэтому используйте поддельный, чтобы перейти к логике тестирования!

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

...