マングースモデルのインスタンス化をテストするJest

Efemorav

Expressとマングースで構築されたRESTAPIをテストしようとしています。http呼び出しにjestとsupertestを使用しています。また、私はjavascriptを使用したテストに比較的慣れていません。

作成URLをテストするとき、インスタンス化がreq.bodyオブジェクトだけを使用して呼び出されることを確認したくありませんが、モックオブジェクトとスタブ、およびいくつかのJestの違いについて多くを読んだ後、その方法がわかりません。私の最後の試みのドキュメントは次のようになります:

test('Should instantiate the model using req.body', done => {

  const postMock = jest.fn();

  const testPost = {
    name: 'Test post',
    content: 'Hello'
  };

  postMock.bind(Post); // <- Post is my model

  // I mock the save function so it doesn't use the db at all
  Post.prototype.save = jest.fn(cb => cb(null, testPost));

  // Supertest call
  request(app).post('/posts/')
  .send(testPost)
  .then(() => {
    expect(postMock.mock.calls[0][0]).toEqual(testPost);
    done();
  })
  .catch(err => {throw err});

});

また、promise拒否のテストに手動で失敗する方法を知りたいので、 Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

フランシスコマテオ

現状では、ルートハンドラー関数自体を分離してそれだけをテストするのではなく、より多くの統合テストを実行しています。

まず、ハンドラーを/posts/独自のファイルに分割します(まだこれを行っていない場合)。

controllers/post-controller.js

const Post = require('./path/to/models/post')

exports.store = async (req, res) => {
  const post = await new Post(req.body).save()
  res.json({ data: post }
}

次に、ルートを定義した場所でハンドラーを使用します。

const express = require('express')
const app = express()
const postController = require('./path/to/controllers/post-controller')

app.post('/posts', postController.store)

この抽象化により、を分離してpostController.store、で動作することをテストできますreq.body実際のデータベースにヒットしないようにマングースをモックする必要があるPostので、(すでに持っているコードを使用して)そのようにモックを作成できます

path/to/models/__mocks__/post.js

const post = require('../post')

const mockedPost = jest.fn()
mockedPost.bind(Post)

const testPost = {
  name: 'Test post',
  content: 'Hello'
}


Post.prototype.save = jest.fn(cb => {
  if (typeof cb === 'function') {
    if (process.env.FORCE_FAIL === 'true') {
      process.nextTick(cb(new Error(), null))
    } else {
      process.nextTick(cb(null, testPost))
    }
  } else {
    return new Promise((resolve, reject) => {
      if (process.env.FORCE_FAIL === 'true') {
        reject(new Error())
      } else {
        resolve(testPost)
      }
    })
  }
})

module.exports = mockedPost

process.env.FORCE_FAIL何らかの理由で失敗したいかどうかのチェックに注意してください

これで、req.body作品を使用してそれをテストする準備が整いました

post-controller.test.js

// Loads anything contained in `models/__mocks__` folder
jest.mock('../location/to/models')

const postController = require('../location/to/controllers/post-controller')

describe('controllers.Post', () => {
  /**
   * Mocked Express Request object.
   */
  let req

  /**
   * Mocked Express Response object.
   */
  let res

  beforeEach(() => {
    req = {
      body: {}
    }
    res = {
      data: null,
      json(payload) {
        this.data = JSON.stringify(payload)
      }
    }
  })

  describe('.store()', () => {
    test('should create a new post', async () => {
      req.body = { ... }
      await postController(req, res)
      expect(res.data).toBeDefined()

      ...
    })

    test('fails creating a post', () => {
      process.env.FORCE_FAIL = true
      req.body = { ... }

      try {
        await postController.store(req, res)
      } catch (error) {
        expect(res.data).not.toBeDefined()

        ...
      }
    })

  })
})

このコードはテストされていませんが、テストに役立つことを願っています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Jestを使用したマングースモデルのテスト

分類Dev

マングースモデルのインスタンスを作成します

分類Dev

コンテストごとのカスタマイズを可能にする賞品テーブルのデータベースモデリング

分類Dev

Sinonを使用してマングースモデルをスタブ化する

分類Dev

マングースモデルをテストするモカユニット

分類Dev

スプリングレストコントローラーでのモデルのインスタンス化

分類Dev

KERASモデルのトレーニング可能なパラメーターをカスタマイズする

分類Dev

モデルにマングースの保存方法をスタブする

分類Dev

Azure ML:複数のインスタンスでモデルをトレーニングする方法

分類Dev

クライアントとサーバーのマングースモデル間でtypescriptインターフェースを共有する

分類Dev

マングース モデルがインスタンス化されるとアプリが遅くなる

分類Dev

別のモデルクラスでモデルクラスをインスタンス化する方法は?

分類Dev

モデルをインスタンス化し、モデルの別のインスタンスからマテリアル/テクスチャを分離するにはどうすればよいですか?

分類Dev

パンダのマルチインデックスデータフレームをすべてのインデックスでグループ化する

分類Dev

マングースでデータベースモデルを作成する

分類Dev

ワニスはグーグルモバイルテスターのデスクトップサイトをレンダリングしています

分類Dev

Angular2のモジュールロードでシングルトンサービスをインスタンス化する方法

分類Dev

knockout.jsでapplyBindingsのビューモデルをインスタンス化すると、バインディングが壊れます

分類Dev

共有コントローラーインスタンスでPythonがモデルを再インスタンス化する

分類Dev

EmberJS:マスター-詳細、詳細のモデルをマスターの配列モデルのアイテムにバインドする方法

分類Dev

動的テキストフィールドをインスタンス化する

分類Dev

フィルターを使用してモデルインスタンス変数を変更するSpring(Google Lib電話番号のインスタンス化)

分類Dev

デフォルトでマップをインスタンス化する

分類Dev

マルチインデックスパンダデータフレームで1対1のマッピングをフラット化する

分類Dev

モデルからドメインモデルへのビュー、マッピングをテストする場所

分類Dev

SCD1実装のインクリメンタルモデル内でマージステートメントをどのように使用するか

分類Dev

マングースモデルとしてサイト構成を保存する

分類Dev

Objectifyを使用してデータストアエンティティをモデル化する際のアドバイス

分類Dev

コマンドライン(ターミナル)からモデルインスタンスを作成する方法

Related 関連記事

  1. 1

    Jestを使用したマングースモデルのテスト

  2. 2

    マングースモデルのインスタンスを作成します

  3. 3

    コンテストごとのカスタマイズを可能にする賞品テーブルのデータベースモデリング

  4. 4

    Sinonを使用してマングースモデルをスタブ化する

  5. 5

    マングースモデルをテストするモカユニット

  6. 6

    スプリングレストコントローラーでのモデルのインスタンス化

  7. 7

    KERASモデルのトレーニング可能なパラメーターをカスタマイズする

  8. 8

    モデルにマングースの保存方法をスタブする

  9. 9

    Azure ML:複数のインスタンスでモデルをトレーニングする方法

  10. 10

    クライアントとサーバーのマングースモデル間でtypescriptインターフェースを共有する

  11. 11

    マングース モデルがインスタンス化されるとアプリが遅くなる

  12. 12

    別のモデルクラスでモデルクラスをインスタンス化する方法は?

  13. 13

    モデルをインスタンス化し、モデルの別のインスタンスからマテリアル/テクスチャを分離するにはどうすればよいですか?

  14. 14

    パンダのマルチインデックスデータフレームをすべてのインデックスでグループ化する

  15. 15

    マングースでデータベースモデルを作成する

  16. 16

    ワニスはグーグルモバイルテスターのデスクトップサイトをレンダリングしています

  17. 17

    Angular2のモジュールロードでシングルトンサービスをインスタンス化する方法

  18. 18

    knockout.jsでapplyBindingsのビューモデルをインスタンス化すると、バインディングが壊れます

  19. 19

    共有コントローラーインスタンスでPythonがモデルを再インスタンス化する

  20. 20

    EmberJS:マスター-詳細、詳細のモデルをマスターの配列モデルのアイテムにバインドする方法

  21. 21

    動的テキストフィールドをインスタンス化する

  22. 22

    フィルターを使用してモデルインスタンス変数を変更するSpring(Google Lib電話番号のインスタンス化)

  23. 23

    デフォルトでマップをインスタンス化する

  24. 24

    マルチインデックスパンダデータフレームで1対1のマッピングをフラット化する

  25. 25

    モデルからドメインモデルへのビュー、マッピングをテストする場所

  26. 26

    SCD1実装のインクリメンタルモデル内でマージステートメントをどのように使用するか

  27. 27

    マングースモデルとしてサイト構成を保存する

  28. 28

    Objectifyを使用してデータストアエンティティをモデル化する際のアドバイス

  29. 29

    コマンドライン(ターミナル)からモデルインスタンスを作成する方法

ホットタグ

アーカイブ