Logo
Section 1 / 6

测试预期

学习如何使用期望值来判断测试是否通过或失败。

导入

测试预期

学习如何使用期望值来判断测试是否通过或失败。

测试遵循一种称为 **安排、操作、断言(AAA)** 的模式。

  • 安排:这意味着为测试准备环境。例如,我们可能需要准备一些模拟数据或以用户身份登录。

  • 操作:这是执行我们想要测试的操作的阶段。

  • 断言:这是验证操作预期结果的阶段。期望值决定了测试是否通过或失败。

...

Jasmine 语法

Jasmine 测试套件被包裹在一个名为 describe 的函数中。它接受两个参数:测试套件的标题和包含单元测试的匿名函数。每个测试都用一个名为 it 的函数包裹。该函数接受两个参数:描述信息和包含单元测试的匿名函数。Jasmine 提供了称为 toBe、toEqual 和 toBeNull 的匹配器,用于检查单元测试的结果。

  • toBe:检查结果是否与预期值完全相同。
  • toEqual:检查结果是否具有相同的值或相同的属性,与预期值一致。
  • toBeNull:检查结果是否为 null。

我们的第一个测试

让我们来看一个针对格式化价格函数的首个 Jasmine 测试。在测试中,我们传入 150 这个值调用该函数。然后使用 expect 方法来验证结果是否是我们期望的值,比如 $1.50。点击下面的“运行”按钮来运行我们的第一个 Jasmine 测试。

No configuration found for ID: d2f6c6e34e53ae3eedc046ca568e6e8330b26db644d38aa2b373ead35b2b117b

toEqual 和 toBe 期望的区别

toEqual 和 toBe 期望有什么区别?对于基本类型(如字符串和数字),这两个期望的行为是一样的。但在比较对象时,它们的区别就显现出来了。toEqual 会检查对象的键和值是否相同,而 toBe 则检查是否指向同一个对象引用。请看下面的例子。函数按我们预期工作,但测试会失败。你能找到修复测试使其通过的方法吗?

No configuration found for ID: 8d2d9fd6e57f5adb1effd6e90616bd994e022f88aee10ce36e766fb67187b7f5

有几种解决方案。当 save 函数运行时,它返回的是 user 对象的引用。因此,我们可以使用 toBe 编写一个测试,期望结果是 user 对象的引用。

1const user = { 2 name: 'Jane Doe', 3 email: 'jane@example.com' 4}; 5 6const result = save(user); 7 8expect(result).toBe(user);

或者,我们可以使用 toEqual 期望,它的要求更宽松。它会逐个检查对象中的每个键值对,确保它们与预期值匹配。

1const user = { 2 name: 'Jane Doe', 3 email: 'jane@example.com' 4}; 5 6const result = save(user); 7 8expect(result).toEqual({ 9 name: 'Jane Doe', 10 email: 'jane@example.com' 11});

.not 期望

我们已经可以使用前面介绍的 toEqual 和 toBe 期望完成很多任务。Jasmine 还提供了其他一些有用的期望,比如 .not 期望。我们可以将 .not 链接到期望之后,用来否定该期望。请看下面的例子,第 10 行使用了 reverse 函数来反转一个字符串。我们期望反转后的结果不等于原始字符串。

No configuration found for ID: ea3022d12915a1ed6c50def843dca28e5ec9650901a9ab13d1f9d06ffbaae320

下面是另一个例子,我们有一个 clone 函数。我们使用 .not 来测试函数是否返回原始对象的一个副本。clone 函数将所有键值对复制到一个新对象中。我们的测试确保 result 是一个新对象,而不是原始对象的引用。

你的任务是添加另一个期望,检查 result 对象是否与原始对象具有相同的键值对。

  1. 在第 19 行尝试添加另一个期望。

  2. 重新运行代码,确保你的新期望能够通过。

以下是解决方案。注意 toEqual 和 toBe 在这里的处理方式完全不同。

1expect(result).not.toBe(user); 2expect(result).toEqual(user);
1expect(result).not.toBe(user); 2expect(result).toEqual(user);

No configuration found for ID: 6435c4956fc3cfae90485cd39546fd21a2880d2a02a35c3b344f27da372acc73

toBeNull 期望

另一个有用的期望是 toBeNull。以下是一个 getSetting 方法的例子,它返回一个值。我们的测试检查结果是否不为 null。

No configuration found for ID: 362e0ac8454913b6621907a0cab8754448c39b2c90166fb9f0b0cbdcc3884dd7

比较操作

在测试数值时,我们可以使用 toBeGreaterThan 和 toBeLessThan 这类比较方法。这些方法在测试边界条件时非常有用。

编程练习

我们有一个函数,接收一个字符串并将其转换为大写。使用 Jasmine 编写一个测试,调用该函数并验证结果。

No configuration found for ID: 77799f13f514bd60a8a96c374c29c294dff30b7acdcbfbfc2c506ee91996f3a3

首先使用 describe 和 it 函数来设置你的单元测试。

1describe('大写测试', () => { 2 it('将字符串转为大写', () => { 3 // 你的代码放在这里 4 }); 5});

你可以在下方点击“显示答案”按钮查看上述问题的解决方案。

1// 要测试的函数 2function capitalize(value) 3{ 4 return value.toUpperCase(); 5} 6 7// 测试套件 8describe('大写测试', () => { 9 it('将字符串转为大写', () => { 10 const result = capitalize("Hello world!"); 11 12 expect(result).toEqual("HELLO WORLD!"); 13 }); 14});

我们现在已经掌握了如何编写检查条件的期望,以判断测试是否通过或失败。

课程简介

设置和清理 Jasmine 测试