我正在尝试将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();
});
});
有人有经验应对吗? 已建议我进行检查以发现错误,但是这似乎很复杂,并且不必要地重复了检查代码。
答案 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
});