2011-05-23 40 views
1

我在使用QUnit + JsMockito測試Javascript對象時發生一些方法調用斷言時遇到問題。基本的基礎架構工作正常:Qunit,JsHamcrest(Jsmockito依賴)和Jsmockito在套件定義中正確初始化。jsMockito方法調用斷言不按預期方式工作

我想斷言調用「數據存儲#創建」方法與對象作爲參數,如下所示:

var store = {create: function(arg) {}}; 

test("save()", function() { 
    var dataStoreMock = mock(store); 

    var objectUnderTest = { value: 'aaa', 
         dataStore: dataStoreMock, 
         save: function() {this.dataStore.create({name: this.value});}} 

objectUnderTest.save(); 
verify(dataStoreMock).create({name: 'aaa'}); 
}); 

我得到的斷言錯誤:「通緝而不是調用:obj.create(等於[目標對象])」

我首先懷疑是該對象的平等是不工作如我所料,證明的是,在穿過原始數據類型,而不是對象的調用時工作斷言:

this.dataStore.create(this.value); //actual code 
verify(dataStoreMock).create('aaa'); //test 

我試圖用jsHamcrest「equalTo」匹配沒有成功(截至jsMockito文檔曝光),以及:

verify(dataStoreMock).create(equalTo({name: 'aaa'})); 

有沒有人對如何使這種說法的工作任何想法?

回答

1

斷言是檢查對象本身,而不是它的屬性,JsHamcrest'equalTo'匹配器不會深入檢查對象(它與javascript'=='運算符相同)。

你可以簡單地檢查它是否是一個對象:

verify(dataStoreMock).create(object()); 

或者是有JsHamcrest匹配「hasMember」,你可以爲使用:如果您使用的是

verify(dataStoreMock).create(hasMember('name')); 

jshamcrest 0.6.4或更高版本(或當前的HEAD),那麼您還可以通過將匹配器作爲hasMember的第二個參數來驗證該成員:

verify(dataStoreMock).create(hasMember('name', 'aaa')); 
verify(dataStoreMock).create(hasMember('name', equalTo('aaa'))); 
+0

非常感謝您清除此問題。請在此功能合併後隨時發佈更新。 – 2011-05-24 14:49:02

+0

它現在在jshamcrest的頭上:https://github.com/danielfm/jshamcrest – 2011-05-25 08:08:25

+0

已經更新了我的測試,它的工作! – 2011-05-25 15:44:14