2012-12-28 10 views
6

いくつかの接続スタイルのエンドポイントハンドラ(function(req、resp))を含むnode.jsのアプリケーションを作成していますが、完全なアプリを実行しなくてもそれらに対してユニットテストを書いています。接続スタイルハンドラをユニットテストするためのreq/resオブジェクトを簡単にモックするモジュールはありますか?

私は手動で書いたフィクスチャを「単純に」押すことができますが、これらのフィクスチャをより速く生成するためのライブラリがあるかどうかは疑問でした。

EDIT:私が望むものをさらに説明するために、私のユニットテストで私のハンドラ(私のアプリケーションではない)を実行したいと思います。そのためには、私は偽のreqとresが必要です。それらは私が嘲笑したい2つのオブジェクトです。

私は現在、テストランナーとコアアサートモジュールとしてmochaを使用しています。

答えて

2

appを関数に渡す方法でルートを定義した場合は、supertestを使用してルートをテストできます。

テスト

var app = require('./real-or-fixture-app'); //depends on your setup 

require('routeToTest')(app); 

var request = require("supertest"); 

describe("Test", function(){ 
    it("should test a route", function(done){ 
     request(app) 
      .post("/route") 
      .send({data:1}) 
      .expect(200, done); 
    }); 
}); 

ルート定義

module.exports = function(app){ 
    app.get("/route", .... 
}; 

私は、これはあなたが探しているものは本当にあるが、それは別にあなたのルートをテストするための方法であることは非常に確認していません。

+0

私が探しているではない正確に何とはいえこれは、便利です。私は質問を編集して、私が探しているものをより良く説明しようとします。 返信ありがとう:)その間に私は非常に似たようなものに行った。私はそれが洗剤に見えるように私がsupertestを使用したものをリファクタリングするかもしれません。 –

2

私はこの質問が古いですけど、今これを行うための素晴らしい方法は、あなたがDjangoのテストクライアントライブラリを使用している場合、それはそのように多くの作品Supertest https://github.com/visionmedia/supertest

です。実際のブラウザがあなたのビューに当たっているかのようなテストシナリオを得るためにビュー/ルートの実行をシミュレートします。これはreqとresが嘲笑されていることを意味しますが、予期した方法で動作します。これはSeleniumよりも高速です(または、例えば、Webdriverをカバーする分度器)。

あなたが知っているように、あなたのルートから多くのロジックを移動して、ユニットテストを個別に行うことができます。私はSupertestを単体テストとして使用することを本当に考えていません。なぜなら、あなたは常に単一のコード単位以上をテストしているからです。

+0

はい。自分のモジュールの中に私の "ビジネスロジック"はすでにありましたが、エンドポイントが動作することをテストする方法を探していました。最後に、私が本当に探していたのはユニットよりも統合されていることに気付きました。モジュールの「統合」レベルとユニットのSuperttestはうまく動いています:) –

1

Sinonを使用してモックリクエスト/レスポンスを少し簡単に作成できるように、私がまとめた小さなパッケージに興味があるかもしれません。

本質的には、Expressから標準req/resを模倣したオブジェクトを作成し、検査することができるspysでメソッドを置き換えます。

あなたのテスト:READMEから

src/foo.js

import route from '../src/foo' 
import { mockReq, mockRes } from 'sinon-express-mock' 

describe('my route',() => { 
    it('should foo the bar',() => { 

    const body = { 
     body: { 
     foo: 'bar', 
     }, 
    } 
    const req = mockReq(body) 
    const res = mockRes() 

    route(req, res) 

    expect(res.json).to.be.calledWith({ foo: body.foo.bar }) 
    }) 
}) 

内容:

export default (req, res) => { 
    res.json({ foo: req.body.bar }) 
} 

https://github.com/danawoodman/sinon-express-mock

関連する問題