2016-05-21 5 views
-1

私はいくつかのルートがエクスポートされたJSコントローラを持っています。私は単体テストのルートで使用されている関数を調べたいと思います。ユニットテストのための高速ルートからの機能を取得するには?

注意私は、単体テストエクスプレスルートへの実際のHTTP要求の作成を提唱する多くのブログを見てきました。それは私の本では単なる単体テストではありません。それは単体テストです。

私はテストで直接関数を呼び出したいので、(ほとんどの)フレームワークをテストから除外します。例えば

controller.js:私のユニットテストで

var express = require('express'); 
var router = express.Router(); 

function foo(req, res) { ... } 
function bar(req, res) { ... } 

router.route("/api/foo").get(foo); 

router.route("/api/bar").post(bodyParser, bar); 

module.exports = router; 

、私は直接foo(res, res)(私はいくつかのモックREQとRESのオブジェクトを作ってあげる)

を呼び出すしたいと思います
+0

Expressルートで文書化されていないことを行いたい場合は、Expressソースコードを見て、ルートの保存方法にアクセスできるかどうかを確認してください。オープンソースなので、コードはすべてあなたに利用可能です。あなたの宿題をやってくれるように頼んでいるようです。 – jfriend00

+0

もちろん、セッションやさまざまなreqやresメソッドなどの他のExpressにアクセスする必要のあるルートや、ミドルウェアを使用するルートがある場合は、たくさんのことをやっています(Expressはあなたのために何をしているのかを再現しています) 。これは単独でルートハンドラをテストしようとするばかげているようだ。あなたはそれが孤立して動作し、コードシステム(特にミドルウェア)の一部ではないと仮定しています。 – jfriend00

+0

@ jfriend00本当にたくさんの嘲笑はしません。少なくとも私の場合はそうです。ちょうどヘッダーとresメソッド。とにかく、他の言語では、テストは外部/注入されたオブジェクトに対して行われたすべての単一の呼び出しを知ってテストするため、多くの模擬は**良い方法**と見なされます。 javaのMockitoと同様に、すべての呼び出しとすべてのパラメータが考慮されます。どのように私は文書化されていないことをしていますか? –

答えて

2

最も簡単な方法は、各機能をmodule.exportsに追加することです。そうすれば、コントローラにテストを要求し、関数を直接呼び出すことができます。

// controller.js 
module.exports = router; 
module.exports._spec = { 
    foo: foo, 
    bar: bar 
}; 


// controlerSpec.js 
var app = require('controller'); 

app._spec.foo(mockReq, mockRes); 
+0

これは完璧です、ありがとうございます。私は、あなたがjavascriptエンティティに必要なものを追加できることを忘れています。 –

関連する問題