2013-07-08 31 views
165

爲什麼以下失敗?chai測試數組相等性無法正常工作

expect([0,0]).to.equal([0,0]); 

什麼是正確的方法來測試?

+1

抱歉,這是我最討厭這些「流暢的語言的原因一個典型的例子「API。這不是英語:它是一種半英語的重擊版本。那麼爲什麼假裝它是英語呢?對於非程序員?那麼我認爲它會更清晰明顯,而不是更少。 「這很容易,你用'equal'來測試相等......哦,不是因爲它在做一個對象比較......好吧,數組就像一個特殊類型的對象......你知道,只需要使用eql作爲數組不要擔心爲什麼。「大! – fool4jesus

回答

258

對於預計.equal將比較對象,而不是他們的數據,在你的情況下,它是兩個不同的數組。

使用.eql爲了深入比較值。看看這個link
或者您可以使用.deep.equal來模擬與.eql相同的效果。
或者在你的情況下,你可能想要check.members

對於斷言您可以使用.deepEqual,link

+2

FTR,深層平等語法已更改爲:'.deepEqual()'(http://chaijs.com/api/assert)。 – Ludder

+4

它沒有改變,你正在查看** Asserts **功能,但不是**期望/應該**首先關注的主題。 – moka

+4

你說得對,我讀得不好。我認爲這只是另一個API的變化。 – Ludder

39

嘗試使用deep equal。它會比較嵌套數組和嵌套Json。

expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' }); 

請參考main documentation site

+4

這也適用於數組:'expect([1,5,10] .sort())。to.deep.equal([1,10,5])' – alxndr

-1

這是如何使用chai深度測試關聯數組。

我有一個問題,試圖斷言兩個聯合陣列是相等的。我知道這些應該不是真的在JavaScript中使用,但我正在編寫遺留代碼的單元測試,它返回對關聯數組的引用。 :-)

我做到了通過定義變量作爲一個對象(不是數組)之前,我的函數調用:

var myAssocArray = {}; // not [] 
var expectedAssocArray = {}; // not [] 

expectedAssocArray['myKey'] = 'something'; 
expectedAssocArray['differentKey'] = 'something else'; 

// legacy function which returns associate array reference 
myFunction(myAssocArray); 

assert.deepEqual(myAssocArray, expectedAssocArray,'compare two associative arrays');