如何测试一个无效的异步功能是否成功?

时间:2019-03-19 02:37:39

标签: typescript jestjs

您如何简洁地测试是否用jest成功执行了void异步函数?我正在使用TypeScript。

// foo.ts
export class Foo {
  public async bar(): Promise<void> {
    await someAsync();
  }
}

如何测试new Foo().bar()不会引发错误?

4 个答案:

答案 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()