## 9.測驗和練習入門
> 原文: [http://exploringjs.com/impatient-js/ch_quizzes-exercises.html](http://exploringjs.com/impatient-js/ch_quizzes-exercises.html)
>
> 貢獻者:[so-hard](https://github.com/so-hard)
在大多數章節中,都有測驗和練習。它們是付費功能,但可以進行全面預覽。本章介紹如何開始使用它們。
### 9.1 測驗
安裝:
* 下載并解壓縮`impatient-js-quiz.zip`
運行測驗應用程序:
* 在 Web 瀏覽器中打開`impatient-js-quiz/index.html`
* 你會看到所有測驗的 TOC。
### 9.2 練習
#### 9.2.1 獲取練習
獲取練習步驟如下:
* 下載并解壓縮`impatient-js-code.zip`
* 按照`README.md`中的說明進行操作
#### 9.2.2 運行練習
* 練習在本書中的路徑。
* 例如:`exercises/quizzes-exercises/first_module_test.js`
* 每個文件的內容:
* 第一行包含運行練習的命令。
* 接下來的幾行描述了你要做的事情。
### 9.3 JavaScript 中的單元測試
本書中的所有練習都是通過測試[ava](https://github.com/avajs/ava)框架 運行的測試。本節簡要介紹。
#### 9.3.1 典型的測試
典型的測試代碼分為兩部分:
* 第 1 部分:被測試的代碼。
* 第 2 部分:測試代碼
舉例來說,以下兩個文件:
* `id.js`(待測代碼)
* `id_test.js`(測試)
##### 9.3.1.1 第 1 部分:被測試的代碼
代碼本身駐留在`id.js`中:
```js
export function id(x) {
return x;
}
```
劃重點:必須暴露出要要測試的代碼。否則,測試代碼無法訪問它。
##### 9.3.1.2 第 2 部分:測試
 **不要擔心測試的確切細節**
您無需擔心測試的確切細節:它們始終為您實施。因此,您只需要閱讀它們,但不要寫它們。
代碼測試位于`demos/quizzes-exercises/id_test.js`:
```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 行 - [斷言](ch_assertion-api.html):`assert.equal()`指定`id('abc')`的預期結果是`'abc'`。
至于其他線路:
* A 行:導入測試框架。
* B 行:導入斷言庫,AVA
* C 行:導入我們要測試的功能
* D 行:通過調用函數`test()`來創建一個測試:
* 第一個參數:該測試的名字。
* 第二個參數:參數為t的箭頭函數,參數t給我們提供了AVA的api(assertions 等等)
運行測試,我們在命令行中執行以下命令:
```js
npm t demos/quizzes-exercises/id_test.js
```
`t`是`test`的縮寫。也就是說,這個命令的長版本是:
```js
npm test demos/quizzes-exercises/id_test.js
```
 **練習:你的第一次練習**
測試的初體驗:
* `exercises/quizzes-exercises/first_module_test.js`
#### 9.3.2 AVA中的異步測試
 **閱讀**
您可以推遲閱讀本節,直到您進入異步編程的章節。
為異步代碼編寫測試需要額外的工作:當測試返回時,他會后會收到它的結果,并向 AVA 發出信號,表示它還沒有完成。以下小節將分析三種異步方法。
##### 9.3.2.1 回調異步
如果我們用`test.cd()`來替代`test()`,AVA會切換到基于回調的異步。當我們的回調函數結束后,必須用調用`t.end()`
```js
test.cb('divideCallback', t => {
divideCallback(8, 4, (error, result) => {
if (error) {
t.end(error);
} else {
assert.strictEqual(result, 2);
t.end();
}
});
});
```
##### 9.3.2.2 Promise異步
如果在測試里返回一個Proise,AVA 將其切換到基于`Promise`的異步。如果Promise狀態為`fulfilled`則認為測試成功,如果`Promise`的狀態為`rejected`則認為測試失敗。
```js
test('dividePromise 1', t => {
return dividePromise(8, 4)
.then(result => {
assert.strictEqual(result, 2);
});
});
```
##### 9.3.2.3 異步函數作為測試“主體”
異步函數總是返回`Promises`。因此,異步函數是實現異步測試的便捷方式。以下代碼與前面的示例等效。
```js
test('dividePromise', async () => {
const result = await dividePromise(8, 4);
assert.strictEqual(result, 2);
// No explicit return necessary!
});
```
你不需要顯式返回任何內容:隱式返回的undefined則說明異步函數返回的`Promise`的狀態為fulfiled。如果測試代碼拋出異常,則`Promise`狀態為rejected。
- I.背景
- 1.關于本書(ES2019 版)
- 2.常見問題:本書
- 3. JavaScript 的歷史和演變
- 4.常見問題:JavaScript
- II.第一步
- 5.概覽
- 6.語法
- 7.在控制臺上打印信息(console.*)
- 8.斷言 API
- 9.測驗和練習入門
- III.變量和值
- 10.變量和賦值
- 11.值
- 12.運算符
- IV.原始值
- 13.非值undefined和null
- 14.布爾值
- 15.數字
- 16. Math
- 17. Unicode - 簡要介紹(高級)
- 18.字符串
- 19.使用模板字面值和標記模板
- 20.符號
- V.控制流和數據流
- 21.控制流語句
- 22.異常處理
- 23.可調用值
- VI.模塊化
- 24.模塊
- 25.單個對象
- 26.原型鏈和類
- 七.集合
- 27.同步迭代
- 28.數組(Array)
- 29.類型化數組:處理二進制數據(高級)
- 30.映射(Map)
- 31. WeakMaps(WeakMap)
- 32.集(Set)
- 33. WeakSets(WeakSet)
- 34.解構
- 35.同步生成器(高級)
- 八.異步
- 36. JavaScript 中的異步編程
- 37.異步編程的 Promise
- 38.異步函數
- IX.更多標準庫
- 39.正則表達式(RegExp)
- 40.日期(Date)
- 41.創建和解析 JSON(JSON)
- 42.其余章節在哪里?