断言

为了帮助开发者编写测试,Deno 标准库提供了内置的 断言模块,可从 https://deno.land/std@$STD_VERSION/testing/asserts.ts 导入。

  1. import { assert } from "https://deno.land/std@$STD_VERSION/testing/asserts.ts";
  2. Deno.test("Hello Test", () => {
  3. assert("Hello");
  4. });

断言模块提供了九个断言函数:

  • assert(expr: unknown, msg = ""): asserts expr
  • assertEquals(actual: unknown, expected: unknown, msg?: string): void
  • assertNotEquals(actual: unknown, expected: unknown, msg?: string): void
  • assertStrictEquals(actual: unknown, expected: unknown, msg?: string): void
  • assertStringContains(actual: string, expected: string, msg?: string): void
  • assertArrayContains(actual: unknown[], expected: unknown[], msg?: string): void
  • assertMatch(actual: string, expected: RegExp, msg?: string): void
  • assertThrows(fn: () => void, ErrorClass?: Constructor, msgIncludes = "", msg?: string): Error
  • assertThrowsAsync(fn: () => Promise<void>, ErrorClass?: Constructor, msgIncludes = "", msg?: string): Promise<Error>

断言

assert 方法是一个简单的“真值”断言,可用于断言任何可以推导为 true 的值。

  1. Deno.test("Test Assert", () => {
  2. assert(1);
  3. assert("Hello");
  4. assert(true);
  5. });

相等性

可用的相等性断言有三个:assertEquals()assertNotEquals()assertStrictEquals().

assertEquals()assertNotEquals() 方法提供常规的相等性检查,并能够断言基本类型和对象的相等性。

  1. Deno.test("Test Assert Equals", () => {
  2. assertEquals(1, 1);
  3. assertEquals("Hello", "Hello");
  4. assertEquals(true, true);
  5. assertEquals(undefined, undefined);
  6. assertEquals(null, null);
  7. assertEquals(new Date(), new Date());
  8. assertEquals(new RegExp("abc"), new RegExp("abc"));
  9. class Foo {}
  10. const foo1 = new Foo();
  11. const foo2 = new Foo();
  12. assertEquals(foo1, foo2);
  13. });
  14. Deno.test("Test Assert Not Equals", () => {
  15. assertNotEquals(1, 2);
  16. assertNotEquals("Hello", "World");
  17. assertNotEquals(true, false);
  18. assertNotEquals(undefined, "");
  19. assertNotEquals(new Date(), Date.now());
  20. assertNotEquals(new RegExp("abc"), new RegExp("def"));
  21. });

assertStrictEquals() 基于 === 运算符提供了更简单、严格的检查。相同对象的两个实例不会判断为相等,因为引用不相同。

  1. Deno.test("Test Assert Strict Equals", () => {
  2. assertStrictEquals(1, 1);
  3. assertStrictEquals("Hello", "Hello");
  4. assertStrictEquals(true, true);
  5. assertStrictEquals(undefined, undefined);
  6. });

assertStrictEquals() 最好用于精确判断两个基本类型的相等性。

包含

assertStringContains()assertArrayContains() 可用于断言包含关系。

assertStringContains() 方法检查一个字符串是否包含了预期的字符串。

  1. Deno.test("Test Assert String Contains", () => {
  2. assertStringContains("Hello World", "Hello");
  3. });

assertArrayContains() 方法稍微高级一些,能够找到一个数组内的值,或是子数组。

  1. Deno.test("Test Assert Array Contains", () => {
  2. assertArrayContains([1, 2, 3], [1]);
  3. assertArrayContains([1, 2, 3], [1, 2]);
  4. assertArrayContains(Array.from("Hello World"), Array.from("Hello"));
  5. });

正则表达式

通过 assertMatch() 方法断言正则匹配。

  1. Deno.test("Test Assert Match", () => {
  2. assertMatch("abcdefghi", new RegExp("def"));
  3. const basicUrl = new RegExp("^https?://[a-z.]+.com$");
  4. assertMatch("https://www.google.com", basicUrl);
  5. assertMatch("http://facebook.com", basicUrl);
  6. });

抛出错误

在 Deno 中有两种方式断言抛出错误的行为:assertThrows()assertAsyncThrows()

两种方式都能检查抛出错误 的类型和信息。

两种方式的区别是 assertThrows() 接收一个标准函数,而 assertAsyncThrows() 接收一个返回 Promise 的函数。

assertThrows() 将检查抛出的错误,也可以检查所抛出的错误的类型是否正确,并判断错误消息是否符合预期。

  1. Deno.test("Test Assert Throws", () => {
  2. assertThrows(
  3. () => {
  4. throw new Error("Panic!");
  5. },
  6. Error,
  7. "Panic!",
  8. );
  9. });

assertAsyncThrows() 稍微复杂一点,主要是因为它处理 Promise。它将捕获 Promise 中抛出的错误或 rejection。您还可以选择检查错误类型和错误消息。

  1. Deno.test("Test Assert Throws Async", () => {
  2. assertThrowsAsync(
  3. () => {
  4. return new Promise(() => {
  5. throw new Error("Panic! Threw Error");
  6. });
  7. },
  8. Error,
  9. "Panic! Threw Error",
  10. );
  11. assertThrowsAsync(
  12. () => {
  13. return Promise.reject(new Error("Panic! Reject Error"));
  14. },
  15. Error,
  16. "Panic! Reject Error",
  17. );
  18. });

自定义消息

Deno 的每个内置断言都允许您覆盖标准 CLI 错误消息。

这个示例将输出 “Values Don’t Match!”,而不是标准 CLI 错误消息。

  1. Deno.test("Test Assert Equal Fail Custom Message", () => {
  2. assertEquals(1, 2, "Values Don't Match!");
  3. });