2015-10-12 15 views

答えて

11

ルータには、要求、応答、およびコールバックを受け入れる"private" method named handleがあります。 Expressが持っているRouterのテストを見ることができます。一つの例は次のとおりです。

it('should support .use of other routers', function(done){ 
    var router = new Router(); 
    var another = new Router(); 

    another.get('/bar', function(req, res){ 
     res.end(); 
    }); 
    router.use('/foo', another); 

    router.handle({ url: '/foo/bar', method: 'GET' }, { end: done }); 
    }); 

エクスプレスチームはRouterに統合テストを実行するためにSuperTestを使用しています。 SuperTestはまだネットワークを使用していますが、これらはすべてあなたのために処理されるので、テストがすべてメモリ内にあるかのように動作します。 SuperTestは広く使われているようであり、あなたのルートをテストするための許容可能な方法です。

あなたはあなたがテストしようとしていることを言っていませんでしたが、目的がいくつかのルートをテストすることであれば、SuperTestの代わりに、ルート内のロジックをテスト可能な別のモジュールExpressから独立しています。

変化:

routes 
| 
-- index.js 

に:

routes 
| 
-- index.js 
| 
controllers 
| 
-- myCustomController.js 

テストは、単にmyCustomController.jsを標的とし、任意の必要な依存関係を注入することができました。

+1

@oligofren:ルータに偽のリクエストを送信する方法を示すための回答を更新しました。 – carpenter

+0

母、私と同じ線にリンクを追加しました。 – oligofren

3

Expressのソースに行くと、私が望むほど簡単なAPIがあることがわかりました。それはthe tests for express.Routerに記載されています。

/** 
* @param {express.Router} router 
*/ 
function dispatchToRouter(router, url, callback) { 

    var request = { 
     url : url, 
     method : 'GET' 
    }; 

    // stub a Response object with a (relevant) subset of the needed 
    // methods, such as .json(), .status(), .send(), .end(), ... 
    var response = { 
     json : function(results) { 
      callback(results); 
     } 
    }; 

    router.handle(request, response, function(err) { 
     console.log('These errors happened during processing: ', err); 
    }); 
} 

しかし、欠点は、まさにそれが最初の場所で文書化されていません理由は、ある...:

/** 
* Dispatch a req, res into the router. 
* @private 
*/ 

proto.handle = function handle(req, res, out) { 
    var self = this; 
    ... 
} 

だから、このコードに依存することである:それはRouter.prototypeのプライベート関数であります世界で最も安全なものではありません。

+1

同じことがわかったようです。プライベートな方法ではないものがあることを願っています。 – carpenter

+0

あなたの編集中に私が見つけた情報を追加するのはおそらく忙しかったです:-)私は、そのアプローチが多くのことを単純化するので私はプライベートメソッドを使います。 Expressのアップグレードでインターフェイスが破損した場合に備えて、一連のテストを追加するだけです。 – oligofren

1

run-middlewareモジュールを正確に使用できます。あなたは急行アプリにusuaulを作成し、次にあなたは

it('should support .use of other routers', function(done){ 
    var app=require('express')()  
    app.get('/bar', function(req, res){ 
     res.status(200).end(); 
    }); 
    app.runMiddleware('/bar',{options},function(responseCode,body,headers){ 
     console.log(responseCode) // Should return 200 
     done() 
    }) 
    }); 

詳細情報あなたのパラメータを使用してアプリケーションを呼び出すことができます。

開示:私は、このモジュールのメンテナ&最初の開発者です。

+0

これでPOST、PUT、またはPATCHリクエストでリクエスト本文をどのように送信しますか? – idbehold

+0

良い質問です。 optionsパラメータを渡します。 (例: 'app.runMiddleware( '/ path'、{method: 'post'}、コールバック)'。 – Aminadav

+0

ええ、実際のリクエストボディはどのように設定するのですか? – idbehold

関連する問題