2013-03-14 61 views
3

我試圖單元測試的CouchDB設計文檔(使用couchapp.js寫的),例如:單元測試不可用全局函數(couchapp,摩卡)

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

然後我就可以要求這個文件放到摩卡測試非常容易。

問題是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); 
    }) 
    }) 
}) 

但摩卡失敗,全球泄漏的投訴。

所有這一切開始「味道錯了」,所以想知道是否有更好/更簡單的方法通過任何圖書館,甚至摩卡之外?

基本上我想讓每個測試都可以使用模擬實現,我可以從中調用assert。

任何想法?

回答

0

我想用sinon來存根和窺探測試。 http://sinonjs.org/https://github.com/domenic/sinon-chai

全局是好的,不受歡迎但很難消除。我正在做一些jQuery相關的測試,並且必須在我的摩卡命令行的末尾使用--globals window,document,navigator,jQuery,$,所以......是的。

你是不是測試CouchDB的EMIT,讓你因爲)你認爲它的工作原理應該存根它和b)你知道它會返回

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

興農文檔的這一部分可能會有所幫助:

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" })); 
}); 

希望有所幫助。