38

私のアプリケーションには、ミドルウェア、コントローラー、マネージャーなど、いくつかのレイヤーがあります。コントローラのインターフェイスはミドルウェアのインターフェイスと同じです:(req、res、next)。

だから私の質問は:サーバーを起動してローカルホストに「実際の」リクエストを送信せずにコントローラーをテストするにはどうすればよいですか?私がやりたいのは、nodejsと同じように要求と応答のインスタンスを作成してから、コントローラーメソッドを呼び出すことです。

このようなもの:

var req = new Request()
var res = new Response()
var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)

アドバイスをいただければ幸いです。ありがとう!

PSこれを実行したい理由は、最後に、応答オブジェクトにjadeビューの正しい変数が含まれているかどうかをテストしたいからです。

4

6 に答える 6

11

JavaScript は動的に型付けされた言語であるため、次のようにモック オブジェクトを作成してコントローラーに渡すことができます。

var req = {};
var res = {};
var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)

コントローラーが要求または応答オブジェクトからの特定のデータまたは機能を必要とする場合、モックでそのようなデータまたは機能を提供する必要があります。例えば、

var req = {};
req.url = "http://google.com"; // fake the Url

var res = {};
res.write = function(chunk, encoding) { 
  // fake the write method 
};

var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)
于 2013-01-23T21:58:04.033 に答える
4

実数reqresオブジェクトを使用する場合は、実数のリクエストをサーバーに送信する必要があります。しかし、これはあなたが思っているよりもはるかに簡単です。express github repoには多くの例があります。以下は、req.route

var express = require('../')
  , request = require('./support/http');

describe('req', function(){
  describe('.route', function(){
    it('should be the executed Route', function(done){
      var app = express();

      app.get('/user/:id/edit', function(req, res){

        // test your controllers with req,res here (like below)

        req.route.method.should.equal('get');
        req.route.path.should.equal('/user/:id/edit');
        res.end();
      });

      request(app)
      .get('/user/12/edit')
      .expect(200, done);
    })
  })
})
于 2013-02-05T09:15:14.603 に答える
4

少し古い投稿ですが、2 セントを差し上げたいと思います。実行するアプローチは、単体テストと統合テストのどちらを行うかによって異なります。スーパーテストを使用するルートをたどる場合、それは実際の実装コードを実行していることを意味し、統合テストを行っていることを意味します。それがあなたがやりたいことなら、このアプローチは問題ありません。

しかし、単体テストを行っている場合は、 req オブジェクトと res オブジェクト (および関連するその他の依存関係) をモックします。以下のコード (簡潔にするために関連のないコードは削除されています) では、テストに必要な唯一のメソッドであるため、res をモックし、json メソッドのモック実装を提供しています。

// SUT
kids.index = function (req, res) {
if (!req.user || !req.user._id) {
    res.json({
        err: "Invalid request."
    });
} else {
    // non-relevent code
}
};

// Unit test
var req, res, err, sentData;
describe('index', function () {

    beforeEach(function () {
        res = {
            json: function (resp) {
                err = resp.err;
                sentData = resp.kids;
            }
        };
    });
    it("should return error if no user passed in request", function () {
        req = {};

        kidsController.index(req, res);
        expect(err).to.equal("Invalid request.");

    });

    /// More tests....
})
于 2015-01-26T14:57:15.493 に答える