テストの作成は、開発サイクルの非常に重要な部分になる可能性があります。 ほとんどのコードはテストが簡単で、データが入り、テストを書いて正しいデータが出てくることを確認します。 ネットワークリクエストを導入すると、事態は難しくなり始めます。 APIサーバーを立ち上げて統合テストを作成するのは簡単ですが、それほどオーバーヘッドが必要ない場合や、サードパーティのAPIに対してテストしようとしている場合はどうでしょうか。 ノックはあなたをカバーしました。

nock、または「ネットワークモック」は、HTTPサーバー要求をモックするためのライブラリです。 Nodeの組み込みのhttpおよびhttpsリクエストでうまく機能するだけでなく、スーパーエージェントなどのこれらのインターフェースを使用する他のリクエストライブラリでもうまく機能します。 axios

入門

nockの使用を開始するのは簡単です。必要なのは、プロジェクトに追加することだけです。 実稼働サイトでは使用しない可能性が高いため、開発依存関係としてインストールすることをお勧めします。

yarn経由

$ yarn add Jock --dev

npm経由

$ npm install nock --save-dev

テストスクリプトでrequireすることを忘れないでください。

const nock = require('nock');

基礎

nockは、モックされたネットワーク要求またはインターセプターを定義できるようにすることで機能します。

nockオブジェクト自体がホスト名を受け取り、リクエストメソッド(.get().post().put()、または.delete())をチェーンできます。 )私たちはそれに嘲笑したい。

リクエストメソッドをチェーンする場合、最初の引数としてエンドポイントのURIを渡す必要があり、オプションで、その後にリクエスト本文を渡す必要があります。

最後に必要なのは、サーバーからのモック応答をチェーンすることです。 .reply()は、最初の引数としてHTTPステータスコードを受け入れ、次にオプションで応答を受け入れます。

すべてをまとめると、次のようになります。

nock('http://httpbin.org')
  .post('/post', { id: '123' })
  .reply(200, { status: 'OK' });

インターセプター

テストするネットワークリクエストを作成するコードを実行する前に、コード内のネットワークリクエストの代わりに使用されるモックネットワークリクエストを設定する必要があります。

nock('http://httpbin.org')
  .get('/get')
  .reply(200, {
    "args": {},
    "headers": {
      "Accept":
      "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
      "Accept-Encoding": "gzip, deflate",
      "Accept-Language": "en-US,en;q=0.9",
      "Connection": "close",
      "Cookie": "_gauges_unique_hour=1;
      _gauges_unique_day=1; _gauges_unique_month=1;
      _gauges_unique_year=1; _gauges_unique=1",
      "Host": "httpbin.org",
      "Upgrade-Insecure-Requests": "1",
      "User-Agent": "Mozilla/5.0 (X11; Linux
      x86_64) AppleWebKit/537.36 (KHTML, like
        Gecko) Chrome/70.0.3538.102 Safari/537.36"
      },
      "origin": "0.0.0.0",
      "url": "http://httpbin.org/get"
    }
  });

// Some code that GETs http://httpbin.org/get

上記のnockは正常に戻り(200 OK)、httpbin.orgによって返されるデータを模倣するペイロードを返します。 実際に外部ネットワーク要求を行うことなくすべて!

本格的な統合テストを行うことを失う可能性がありますが、この方法は物事を大幅にスピードアップし、テストハーネスがオンラインのサードパーティサービスに依存していないことを意味します。

これは、コードがCI/CDパイプラインの一部としてデプロイされる前にテストに合格する必要がある場合に特に役立ちます。

内部的には、nockはこれらのインターセプターのリストを保持し、使用されるとリストから削除されます。

インターセプターは作成された順序で使用され、同じホスト名とURIに移動するが、異なるペイロードを返す複数のインターセプターを定義できます。

インターセプターは使用後に削除されるため、ネットワークコールをテストするときはいつでも、インターセプターが使用可能であることを確認する必要があります。

サーバーエラーのモック

残念ながら、多くのAPIには、APIによって返されるエラーをシミュレートできるメカニズムが含まれていません。 この欠点は通常、システムがネットワークの障害やエラーにどれだけうまく対応するかについての指標を与えない、一連のハッピーパステストを作成することにつながります。

リクエストをモックしているので、使用しているAPIがエラーをシミュレートできるかどうかは関係ありません。これらの悪いリクエストを自分でシミュレートするだけです!

コードが5xxサーバーエラーをどのように処理するかをテストしたいとします。

nock('http://httpbin.org')
  .post('/post')
  .reply(500);

// Code we want to make sure handles errors...

すべての例外パスをテストできるということは、神話上の100% codeカバレッジにはるかに近いことを意味します。 🦄

ハッピーnocking!