7.测验和练习

在大多数章节中,都有测验和练习。它们是付费功能,但可以进行全面预览。本章介绍如何开始使用它们。

7.1 测验

  • 下载并解压缩impatient-js-quiz.zip
  • 在 Web 浏览器中打开impatient-js-quiz/index.html
  • 你会看到所有测验的 TOC。

7.2 练习

7.2.1 获取练习

获取练习步骤如下:

  • 下载并解压缩impatient-js-code.zip
  • 按照README.md中的说明进行操作

7.2.2 运行练习

  • 练习在本书中的路径。
    • 例如:exercises/quizzes-exercises/first_module_test.js
  • 每个文件的内容:
    • 第一行包含运行练习的命令。
    • 接下来的几行描述了你要做的事情。

7.3 JavaScript 中的单元测试

本书中的所有练习都是通过测试ava框架 运行的测试。本节简要介绍。

7.3.1 典型的测试

典型的测试代码分为两部分:

  • 第 1 部分:被测试的代码。
  • 第 2 部分:测试代码

举例来说,以下两个文件:

  • id.js(待测代码)
  • id_test.js(测试)
7.3.1.1 第 1 部分:被测试的代码

代码本身驻留在id.js中:

export function id(x) {
  return x;
}

划重点:必须暴露出要要测试的代码。否则,测试代码无法访问它。

7.3.1.2 第 2 部分:测试

您无需担心测试的确切细节:它们始终为您实施。因此,您只需要阅读它们,但不要写它们。

代码测试位于demos/quizzes-exercises/id_test.js

import test from 'ava'; // (A)
import {strict as assert} from 'assert'; // (B)
import {id} from './id.mjs'; // (C)
test('My test', t => { // (D)
  assert.equal(id('abc'), 'abc'); // (E)
});

该测试文件的核心是 E 行 - 断言assert.equal()指定id('abc')的预期结果是'abc'

至于其他线路:

  • A 行:导入测试框架。
  • B 行:导入断言库,AVA
  • C 行:导入我们要测试的功能
  • D 行:通过调用函数test()来创建一个测试:
    • 第一个参数:该测试的名字。
    • 第二个参数:参数为t的箭头函数,参数t给我们提供了AVA的API(assertions 等等)

运行测试,我们在命令行中执行以下命令:

npm t demos/quizzes-exercises/id_test.js

ttest的缩写。也就是说,这个命令的长版本是:

npm test demos/quizzes-exercises/id_test.js

练习:你的第一次练习

  • exercises/quizzes-exercises/first_module_test.js

7.3.2 AVA中的异步测试

您可以推迟阅读本节,直到您进入 第八章:异步

为异步代码编写测试需要额外的工作:当测试返回时,他会后会收到它的结果,并向 AVA 发出信号,表示它还没有完成。以下小节将分析三种异步方法。

7.3.2.1 回调异步

如果我们用test.cd()来替代test(),AVA会切换到基于回调的异步。当我们的回调函数结束后,必须用调用t.end()

test.cb('divideCallback', t => {
  divideCallback(8, 4, (error, result) => {
    if (error) {
      t.end(error);
    } else {
      assert.strictEqual(result, 2);
      t.end();
    }
  });
});
7.3.2.2 Promise异步

如果在测试里返回一个Proise,AVA 将其切换到基于Promise的异步。如果Promise状态为fulfilled则认为测试成功,如果Promise的状态为rejected则认为测试失败。

test('dividePromise 1', t => {
  return dividePromise(8, 4)
  .then(result => {
    assert.strictEqual(result, 2);
  });
});
7.3.2.3 异步函数作为测试“主体”

异步函数总是返回Promises。因此,异步函数是实现异步测试的便捷方式。以下代码与前面的示例等效。

test('dividePromise', async () => {
  const result = await dividePromise(8, 4);
  assert.strictEqual(result, 2);
  // No explicit return necessary!
});

你不需要显式返回任何内容:隐式返回的undefined则说明异步函数返回的Promise的状态为fulfiled。如果测试代码抛出异常,则Promise状态为rejected。