エクスプレスのテストバックエンドサーバー


最近、ノードについて学び、バックエンドAPIサーバーを表現しています.エクスプレス.JSは、Ruby on Railsと同様にMVCパターンを使用して、RESTful CRUD APIを構築することができます.すべてのクルージング作品を表現する方法を学習しながら、私は物事が正しく動作していることを確認する機能をテストしたかった.このブログ記事は、JESTフレームワークとスーパーテストライブラリを使用して、明示的バックエンドAPIのルートのCRUD機能をテストする方法を説明します.

エクスプレスサーバー
私は、あなたがこの記事のために走っている急行サーバーを持っていると仮定します、しかし、下記はこの記事の中でテストを得るために単純なサンプル・アプリです(下記の通り、私はExpressサーバーを構築することに関する若干の追加記事を共有します).下記のコードでは、2つの例を見つけますGET エンドポイントは、いくつかのサンプルコードと一緒にあなたのルートは、実際にどのように見えるときに構築される可能性がありますアイデアを与える.
// server.js
import express from 'express';
const app = express();

app.get('/users', function(req, res) {
  res.json({ users: 'allUsers' });

  // Real code from my application below
  //  model.User.findAll().then (users => {
  //        res.status(200).json({ users });
  //     }).catch(error=>{
  //        console.log(error)
  //        req.status(500).send(error)
  //  })
});

app.get('/users/3', function(req, res) {
  res.json({ user: 'user3' });

  // Real code from my application below
  // const { id } = req.params;
  //    model.User.findOne({
  //        where: { id: Number(id) }
  //    }).then(user=>{
  //        res.status(200).json({ user });
  //    }).catch(error=>{
  //        console.log(error)
  //        req.status(500).send(error)
  //    })
});

export const server = app;
上記のルートを見て、我々はGET リクエスト:すべてのユーザーのための1つ、および選択ユーザーの1つ.我々のテストはGET リクエストはステータスコードを返す200 , 有json content typeと返されるプロパティを含めるusers , or user3 ).

Jest & Supertestの設定
まず第一に、テスト環境を設定しなければなりません.以下はJestとSuperTestの取得と実行の手順です.

依存関係のインストール
npm install jest --save-dev
npm install supertest --save-dev
npm install cross-env --save-dev

テスト環境の設定
テスト環境を設定するにはpackage.json あなたのエクスプレスアプリケーションのフォルダ.次の設定を実行することができますnpm test CLI(テストデータベースのリセットを実行する)では、正確なテスト目的のために毎回データベースを移行・シードします.
  • ノートNODE_ENV=test テスト環境を指定するために使用します.
  • // package.json
     "scripts": {
        ...
        "test": "cross-env NODE_ENV=test jest --testTimeout=10000",
        "pretest": "cross-env NODE_ENV=test npm run migrate:reset",
        "migrate:reset": "npx sequelize-cli db:migrate:undo:all && npm run migrate",
        "migrate": "npx sequelize-cli db:migrate && npx sequelize-cli db:seed:all",
      }
    
    我々は、我々を無視するために、冗談を必要とします./node_modules フォルダのため、コードのこのスニペットをpackage.json :
    ...
     "jest": {
        "testEnvironment": "node",
        "coveragePathIgnorePatterns": [
          "/node_modules/"
        ]
      },
    ...
    
    では、テストを実行してみましょうnpm test コマンドラインで.テスト環境をアップロードして実行しているので、テストを開始することができます!

    書き込みテスト
    私たちは新しい仕事をするつもりですtest.js ファイルは、我々の目標はGET リクエスト:/users and /users/3 .

    輸入
    我々は最初にいくつかの依存関係をインポートする必要があるので、我々はExpressのサーバーをテストすることができます.これらは、我々のトップで行きますtest.js ファイル.
    //test.js
    
    const server = require('../index.js');
    const supertest = require('supertest');
    const requestWithSupertest = supertest(server);
    
    あなたは、我々が使用していることに気づくでしょうrequestWithSupertest , 各テストをサーバーにリンクします.

    すべてのユーザーを得る
    我々が必要とする最初のものは、我々の初期ですdescribe 我々のテストの両方を収容するブロック.このテストでは、どのようにチェックされます/user ルート関数を取得します.
    describe('User Endpoints', () => {
    
      it('GET /user should show all users', async () => {
        const res = await requestWithSupertest.get('/users');
          expect(res.status).toEqual(200);
          expect(res.type).toEqual(expect.stringContaining('json'));
          expect(res.body).toHaveProperty('users')
      });
    
    });
    
    上のコードでawait to requestWithSupertest.get('/users') , 我々が前進する前に満たされる必要がある見込みをテストしているので.それから、私たちは200 状態json content type、および応答体がusers プロパティ.これらの3つの予想は、我々がこのルートの機能性のためにテストしたかったものを満たします.

    IDを取得する
    ので、我々の最初のテストを書いている.今2回目のテストでは、同様のテストを行います/users/3 ルートこのテストでは、ターゲットのユーザーIDの取得ルートのテスト方法を示すことになっていますdescribe 以上で定義したブロック.
      it('GET /user/:id should show a user', async () => {
            const res = await requestWithSupertest.get('/users/3')
            expect(res.statusCode).toEqual(200)
            expect(res.body).toHaveProperty('user3')
        });
    

    テストを実行する
    すごい!我々は、2つのサンプルの機能を確認する2つのテストを書いているGET 路線では、コマンド行でテストを実行します.
    npm test
    
    あなたはテストスイートで2つのパッシングテストを参照してくださいする必要があります!

    結論
    今、あなたのエクスプレスAPIにいくつかのテストを追加するリソースがあります!うまくいけば上記の例では、あなたの急行サーバーの機能を設定し、テストする方法についていくつかの初期の理解を得るのに役立つ!私はExpressのバックエンドAPIの要求をテストする私の知識を展開したい、これは私自身のアプリケーション内でテストを設定する方法です!
    私がエクスプレスを学ぶのを助けるために使用したいくつかの追加のリソース.サーバーをテストする方法
    Node.js Rest APIs example with Express, Sequelize & MySQL by bezkoder
    Building an Express API with Sequelize CLI and Unit Testing! by Bruno Galvao
    Hopscotch.io - a tool to send server requests and see the responses
    この記事は、あなたの急行サーバーをテストすることから始めるのを助けましたか?コメントや推奨事項に対応!