18

Node.js、Mongoose、およびこの環境でのテストは初めてです。次のスキーマを別のファイルで宣言しています。

Issue = mongoose.model("Issue", {
  identifier: String,
    date: String,
    url: String,    
    name: String,
    thumbnailURL: String
});

次に、MongoDB コレクション内のすべてのIssueインスタンスを単純に返すこのメソッドがあります。

function issues(request, response) {
  response.setHeader('Content-Type', 'text/json');

  Issue.find().sort('date').exec(function(error, items) {
    if (error) {
      response.send(403, {"status": "error", "error:": exception});
    }
    else {
      response.send(200, {"issues": items});
    }
  });
}

実験でここまでたどり着いたので、テストしたいのですが、問題が発生しました。MongoDB 接続などを設定せずにテストするにはどうすればよいですか。すべてを設定できることはわかっていますが、それは統合テストです。次のようなものをテストするための単体テストを作成したいと思います。

  • 関数はコンテンツ タイプを正しく設定しますか
  • date関数はフィールドでソートしますか
  • エラーが発生した場合、関数は 403 を返しますか?
  • ... 等々

既存のコードをリファクタリングして単体テストを容易にする方法を知りたいです。responseおよびItemスキーマ オブジェクトをパラメーターとして受け入れて、呼び出される 2 番目の関数を作成しようとしましたが、うまくいきません。誰にもより良い提案がありますか?

4

4 に答える 4

8

Mongoose model(あなたのIssue) は、オブジェクトの新しいインスタンスを返しQueryます。新しいqueryインスタンスは、execを介してメソッドにアクセスできますprototype。(マングース3.8~)

エラーを返したい場合は、次のように記述できます。

sinon.stub(mongoose.Query.prototype, "exec").yields({ name: "MongoError" }, null);
于 2014-11-23T13:42:14.827 に答える
6

私のノードコードでchaijsとsinonjsでmochaを使用すると、次のような方法が機能します。

var should = require('chai').should(),
sinon = require('sinon'),
mongoose = require('mongoose');

it('#issues() handles mongoosejs errors with 403 response code and a JSON error message', function (done) {

// mock request
var request = {};

// mock response
var response = {};
response.setHeader = function(header) {};
response.send = function (responseCode, jsonObject) {
    responseCode.should.equal(403);
    jsonObject.stats.should.equal('error');
    // add a test for "error:": exception
    done();
}

var mockFind = {
    sort: function(sortOrder) {
        return this;
    },
    exec: function (callback) {
        callback('Error');
    }
}

// stub the mongoose find() and return mock find 
mongoose.Model.find = sinon.stub().returns(mockFind);

// run function
issues(request, response);

});
于 2013-11-21T03:26:11.453 に答える
0

開始するのに適した場所は次のとおりです。

  1. スタブとモックに関する概念を調査し、ダブルをテストします。
  2. Node.JS に最適な Mocking フレームワークであるSinon.jsを確認してください。
于 2013-10-09T23:00:44.677 に答える