Как шпионить за асинхронной функцией и утверждать, что она выдает ошибку по sinon? - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь использовать Mocha с ts-node для написания юнит-теста в TypeScript для моего проекта.Когда я использую Sinon для шпиона асинхронной функции, я не могу пройти тест.Ниже мой код

class MyClass {
    async businessFunction(param): Promise<void> {
        if (!param)  //Validate the input
          throw new Error("input must be valid");

        // Then do my business
    }
}

И юнит-тест

describe("The feature name", () => {
    it("The case of invalid", async () => {
        const theObject = new MyClass();
        const theSpider = sinon.spy(theObject, "businessFunction");
        try {
            await theObject.businessFunction(undefined);
        } catch (error) {/* Expected error */}
        try {
            await theObject.businessFunction(null);
        } catch (error) {/* Expected error */}

        sinon.assert.calledTwice(theSpider); // => Passed
        sinon.assert.alwaysThrew(theSpider); // => Failed, why?

        theSpider.restore();
    });
});

У кого-нибудь был опыт, чтобы справиться с этим?Мне предложили сделать проверки с обнаруженными ошибками, но это кажется сложным и заставляет код проверки дублироваться без необходимости.

1 Ответ

0 голосов
/ 20 февраля 2019

Ваша функция является async функцией.

Документы для async функций указывают, что они возвратят:

A Promiseкоторое будет разрешено значением, возвращаемым асинхронной функцией, или отклоненным с неперехваченным исключением, выданным из асинхронной функции.


Другими словами, ваша функция не выдает ошибку, возвращает Promise, который будет отклонен с ошибкой .


Поскольку вы используете Mocha, вы можете использовать что-то вроде .rejected из chai-as-promised, чтобы проверить, что Promise, возвращаемое вашей async функцией, отклоняет:

it("The case of invalid", async () => {
  const theObject = new MyClass();

  await theObject.businessFunction(undefined).should.be.rejected;  // SUCCESS
  await theObject.businessFunction(null).should.be.rejected;  // SUCCESS
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...