2016-03-06 39 views
0

我使用should.js框架(v8.2.x)進行單元測試,並且一直在玩一些非常基本的測試。然而,我遇到了這個測試失敗的問題,這一直困擾着我。現在根據自己的githubshould(something)something.should通常返回相同的事情Should.js - equals方法中的不一致should.equals

should.equal(add('1', '1'), '2'); // passes 
add('1', '1').should.equal('2')  // fails! 

我定義這個虛擬函數測試,add

var add = function(a, b) { 
    if (isNaN(a) || isNaN(b)) { 
    throw new Error('One of the arguments is not a number'); 
    } 
    return +a + +b 
}; 

現在我這裏還有我的假人測試,但沒有關於差異的其他信息。

根據它們的API documentation,should.equalassert.equal相同。但這種測試通過對我來說:

assert.equal(add('1','1'), '2'); // passes 

所以我有三個問題:

  1. 爲什麼add('1', '1').should.equal('2')不能通過?
  2. 爲什麼兩種用法會產生不同的結果?
  3. 爲什麼文檔說should.equalsassert.equals實際上有不同的行爲?
+1

我猜,一個是使用''==,另一個是使用''===。 'add'函數返回一個'Number',你正在比較一個'string'。也許所做的類型強制是不同的?如果你做'add('1','1')should.equal(2)',會發生什麼? –

+0

什麼@ChrisTavares說,每當你處理的測試號VS字符串你應該看看是如何執行的測試,我會假設測試將返回'「11''爲'」 1' +「1''但很明顯,這不是字面意思。 – brod

+0

@ChrisTavares是的,'equals'應該在javascript中使用'=='和'1 =='1''。還有'strictEquals'使用'==='。 'add('1','1')。should.equal(2)'確實通過。 @brod如果你看一下'add',我使用的是一元'+'經營者強迫他們數= –

回答

0

回答你的問題,你錯了什麼。

現在根據他們的github,應該(something)和something應該通常返回相同的東西,但沒有關於差異的額外信息。

should(something) and something.should是的通常是一樣的。但是你使用了should.equal,文檔沒有提到它與其他方法的等價性。這只是copy of的node.js自己assert.equal

爲什麼加( '1', '1')。should.equal( '2')不及格?

因爲docs明確表示它在內部使用===。

爲什麼兩種用法會產生不同的結果?

因爲這是不同的方法,並且無處說它應該是平等的。

爲什麼文檔說,當它們實際上有不同的行爲時,should.equals和assert.equals是一樣的?

$ node 
> var should = require('.') 
undefined 
> var assert = require('assert') 
undefined 
> var add = function(a, b) { 
... if (isNaN(a) || isNaN(b)) { 
.....  throw new Error('One of the arguments is not a number'); 
..... } 
... return +a + +b 
... }; 
undefined 
> should.equal(add('1', '1'), '2'); 
undefined 
> assert.equal(add('1', '1'), '2'); 
undefined 

所以嘗試你有明確自己做錯了什麼:在should.js存在should.equal(a, b)這是一樣的assert.equal。也存在something.should.equal(other)它採用===內部(因爲存在.eql其做深平等檢查),也should(somethng).equal(other)相同something.should.equal(other)(而不是標準的包裝)。

希望它會清楚。