3

私は CouchDB 設計ドキュメント ( couchapp.jsを使用して記述) を単体テストしようとしています。例:

var ddoc = {
  _id: '_design/example',
  views: {
    example: {
      map: function(doc) {
        emit(doc.owner.id, contact);
      }
    }
   }
}
module.exports = contacts

次に、このファイルを mocha テストに非常に簡単に要求できます。

問題は、マップ関数が使用するいくつかのグローバル関数 (上記の「emit」関数) を CouchDB が公開していることです。これらの関数は、CouchDB の外部 (つまり、これらの単体テスト) では使用できません。

各テストでグローバル関数を宣言しようとしました。次に例を示します。

var ddoc = require('../example.js')

describe('views', function() {
  describe('example', function() {
    it('should return the id and same doc', function() {
      var doc = {
        owner: {
          id: 'a123456789'
        }
      }

      // Globally-scoped mocks of unavailable couchdb 'emit' function
      emit = function(id, doc) {
        assert.equal(contact.owner.id, id);
        assert.equal(contact, doc);
      }
      ddoc.views.example.map(doc);
    })
  })
})

しかし、Mocha はグローバル リークの苦情で失敗します。

これらすべてが一緒になって「悪臭」を放ち始めたので、Mochaの外であっても、ライブラリを介したより良い/より簡単なアプローチがあるかどうか疑問に思っていますか?

基本的に、アサートを呼び出すことができるテストごとにモック実装を利用できるようにしたいと考えています。

何か案は?

4

1 に答える 1

0

テストをスタブしてスパイするには、sinonを使用します。http://sinonjs.org/およびhttps://github.com/domenic/sinon-chai

グローバルは望ましくありませんが、排除するのは困難です。私は現在いくつかのjQuery関連のテストを行っており--globals window,document,navigator,jQuery,$、mochaコマンドラインの最後で使用する必要があるので...ええ。

あなたは CouchDb のエミットをテストしていないので、a) それが機能すると仮定し、b) それが何を返すかを知っているので、それをスタブする必要があります。

global.emit = sinon.stub().returns(42);
// run your tests etc
// assert that the emit was called

sinon docs のこの部分が役立つ場合があります。

it("makes a GET request for todo items", function () {
    sinon.stub(jQuery, "ajax");
    getTodos(42, sinon.spy());

    assert(jQuery.ajax.calledWithMatch({ url: "/todo/42/items" }));
});

それが役立つことを願っています。

于 2013-03-27T17:43:12.977 に答える