JavaScript for impatient programmers (ES2022 edition)
この書籍をサポートしてください: 購入する または 寄付する
(広告です。ブロックしないでください。)

10 クイズと演習の始め方



ほとんどの章にクイズと演習があります。これらは有料機能ですが、包括的なプレビューが利用可能です。この章では、それらの使用方法について説明します。

10.1 クイズ

インストール

クイズアプリの実行

10.2 演習

10.2.1 演習のインストール

演習をインストールするには

10.2.2 演習の実行

10.3 JavaScriptにおけるユニットテスト

本書のすべての演習は、テストフレームワーク Mocha を介して実行されるテストです。このセクションでは、簡単な紹介を行います。

10.3.1 典型的なテスト

典型的なテストコードは2つの部分に分かれています。

たとえば、次の2つのファイルを考えてみましょう。

10.3.1.1 パート1: コード

コード自体は id.mjs にあります。

export function id(x) {
  return x;
}

ここで重要なのは、テストしたいものはすべてエクスポートする必要があるということです。そうしないと、テストコードからアクセスできません。

10.3.1.2 パート2: テスト

  テストの正確な詳細については心配しないでください

テストの正確な詳細については心配する必要はありません。テストは常に実装済みです。そのため、読むだけで、書く必要はありません。

コードのテストは id_test.mjs にあります。

// npm t demos/quizzes-exercises/id_test.mjs
suite('id_test.mjs');

import * as assert from 'assert/strict'; // (A)
import {id} from './id.mjs'; // (B)

test('My test', () => { // (C)
  assert.equal(id('abc'), 'abc'); // (D)
});

このテストファイルの中核はD行 - アサーション です: assert.equal() は、id('abc') の期待される結果が 'abc' であることを指定します。

他の行に関しては

テストを実行するには、コマンドラインで以下を実行します。

npm t demos/quizzes-exercises/id_test.mjs

ttest の省略形です。つまり、このコマンドの長いバージョンは次のとおりです。

npm test demos/quizzes-exercises/id_test.mjs

  演習: 最初の演習

次の演習では、演習がどのようなものかについての最初の体験を提供します。

10.3.2 Mochaにおける非同期テスト

  読む

非同期プログラミングの章に進むまで、このセクションの読み取りを延期することをお勧めします。

非同期コードのテストを書くには、追加の作業が必要です。テストは後で結果を受け取り、Mochaにまだ終了していないことを知らせる必要があります。以下のサブセクションでは、そのための3つの方法を検討します。

10.3.2.1 コールバックによる非同期処理

test() に渡すコールバックにパラメータ(例: done)がある場合、Mochaはコールバックベースの非同期処理に切り替えます。非同期処理が完了したら、done を呼び出す必要があります。

test('divideCallback', (done) => {
  divideCallback(8, 4, (error, result) => {
    if (error) {
      done(error);
    } else {
      assert.strictEqual(result, 2);
      done();
    }
  });
});

divideCallback() は次のようになります。

function divideCallback(x, y, callback) {
  if (y === 0) {
    callback(new Error('Division by zero'));
  } else {
    callback(null, x / y);
  }
}
10.3.2.2 Promiseによる非同期処理

テストがPromiseを返す場合、MochaはPromiseベースの非同期処理に切り替えます。Promiseが履行された場合、テストは成功したと見なされ、Promiseが拒否された場合、または処理がタイムアウトよりも長くかかった場合は失敗したと見なされます。

test('dividePromise 1', () => {
  return dividePromise(8, 4)
  .then(result => {
    assert.strictEqual(result, 2);
  });
});

dividePromise() は次のように実装されます。

function dividePromise(x, y) {
  return new Promise((resolve, reject) => {
    if (y === 0) {
      reject(new Error('Division by zero'));
    } else {
      resolve(x / y);
    }
  });
}
10.3.2.3 テストの「本体」としての非同期関数

非同期関数は常にPromiseを返します。そのため、非同期関数は非同期テストを実装するのに便利な方法です。次のコードは、前の例と同等です。

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

明示的に何かを返す必要はありません。暗黙的に返される undefined は、この非同期関数によって返されるPromiseを履行するために使用されます。また、テストコードが例外をスローした場合、非同期関数は返されたPromiseを拒否します。