如何监视异步函数并断言它由sinon引发错误?

时间:2019-02-20 11:59:24

标签: javascript typescript async-await mocha sinon

我正在尝试将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 :(得分:2)

您的函数是async函数。

async函数的docs声明它们将返回:

  

一个Promise,它将由async函数返回的值来解析,或者被async函数内部抛出的未捕获的异常拒绝。


换句话说,您的函数不会引发错误,它将返回一个Promise,该错误将被拒绝


由于使用的是Mocha,因此可以使用chai-as-promised中的.rejected之类的东西来测试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
});