您如何简洁地测试是否用jest成功执行了void异步函数?我正在使用TypeScript。
// foo.ts
export class Foo {
public async bar(): Promise<void> {
await someAsync();
}
}
如何测试new Foo().bar()
不会引发错误?
答案 0 :(得分:6)
这是我发现的最语义化的方式。 它甚至只是测试名称的翻译。
describe("Foo.bar()", () => {
test("Should not throw", async () => {
await expect(new Foo().bar()).resolves.not.toThrow();
});
});
答案 1 :(得分:3)
Promise的优点是它根本不应该抛出,而应该被解决或拒绝。另一方面,即使TypeScript中有stylelint "**/_main.scss"
,toBe()
断言也需要一个参数。
那么,如果没有传递任何参数(或参数为空),但仍会进行评估,该怎么办。参数为Promise<void>
。
undefined
测试 test("Should resolve", async () => {
await expect(new Foo().bar()).resolves.toBe(undefined);
});
恰好对我来说是一个虚假的朋友,因为我的not.toThrow()
没有抛出,也没有解决。
答案 2 :(得分:2)
这是我发现的最好方法。希望有一些更优雅的东西。
describe("Foo.bar()", () => {
it("should not throw", async () => {
expect.assertions(1);
try {
await new Foo().bar();
expect(true).toBeTruthy();
} catch {
// should not come here
}
});
});
答案 3 :(得分:0)
...替代方法是resolves
断言。
describe("Foo.bar()", () => {
it("should not throw", () => {
return expect(new Foo().bar()).resolves.toEqual();
});
});
在这里,您必须返回结果,因为这是一个承诺(并开玩笑等到实现为止)。如果您只需要验证已解决(或已拒绝-则有类似的道具rejects
用于检查拒绝值),它会显得较为简洁。
但是,如果像基于promise的功能运行后需要运行多个检查,则
describe("Foo.bar()", () => {
it("should not throw", () => {
const promise = new Foo().bar()
expect(promise).resolves.toEqual();
expect(someMock).toHaveBeenCalled();
return promise;
});
});
您可能会发现async/await
的选项更……令人满意?
针对您的PS版本
describe("Foo.bar()", () => {
it("should not throw", async () => {
expect.assertions(1);
try {
await new Foo().bar();
expect(true).toBeTruthy();
} catch {
// should not come here
}
});
});
我认为不需要捕获错误-因此expect.assertions
也变得多余。为什么?未捕获的异常将使您的测试失败,并且应该不会有异常,因此可以通过测试。如果您期望异常并要检查其属性,则需要这样的结构。
如果测试失败,则带有expect.assertions
的选项将通知您它已失败,而未捕获的异常将突出显示特定的语句(如果测试有多个异常可能的语句,则很有用)
[UPD]我也错过了要点,您需要检查是否可以用 any 结果来解决诺言(我的版本检查它是用undefined
来解决的,这并不是很好的举措(它如果函数开始返回 something (如果之前返回 nothing ,则不会破坏任何东西)。同时,我们应该至少进行一次检查...
因此,也许您使用存根expect(true)
的方法在这里是合法的。
但是,如果您不想在同一测试用例中赚更多expect
,我将进行两次验证。被测试的陈述真的如此孤立吗?还是只是将相关支票分解为单独的it()
?