2016-11-16 68 views
1

我正在使用Mocha,Chai和Sinon測試一些Node方法。測試總是通過Sinon和Chai

此測試通過,當我將'calledOnce'更改爲'calledTwice'時,它按預期失敗。

it('should call checkIfRoomExists once', function (done) { 
      var check = sandbox.spy(RoomInfoModel, 'checkIfRoomExists'); 
      ViewBusiness.getViewToRender("thisisanoneknownroom", function (viewName) { 
       expect(check.calledOnce).to.equal(true); 
       done(); 
      }) 
     }); 

然而,當我嘗試,並按照教程「期望」設置這樣的:

it('should call checkIfRoomExists once', function (done) { 
     var check = sandbox.spy(RoomInfoModel, 'checkIfRoomExists'); 
     ViewBusiness.getViewToRender("thisisanoneknownroom", function (viewName) { 
      expect(check).to.have.been.calledTwice; 
      done(); 
     }) 
    }); 

請注意,我爲「calledTwice」在第二次試驗測試。它仍然通過。如果我將它更改爲'notCalled',它仍然會通過。基本上它總是通過。

我錯過了什麼?

+0

我應該補充說,這與測試更改狀態無關。我一直在替換另一個並撕下沙箱。 –

回答

1

我可以重現您所報告的行爲的唯一方法是,如果我忘記調用chai.use來添加Sinon的斷言。舉例來說,這個工作正常(測試失敗):

const sinon = require("sinon"); 
const chai = require("chai"); 
const sinonChai = require("sinon-chai"); 
chai.use(sinonChai); // This is crucial to get Sinon's assertions. 
const expect = chai.expect; 

it("test",() => { 
    const stub = sinon.stub(); 
    stub(); 
    expect(stub).to.have.been.calledTwice; 
}); 

但如果你採取相同的代碼和註釋掉chai.use(sinonChai),則測試將通過!


爲了好玩,你可以試試expect(stub).to.have.been.platypus,那也會通過。 Chai的expect接口可以容忍無意義的標識符。

+0

謝謝,那已經排序了!不知道由於預期聲明中的拼寫錯誤,我認爲測試通過了。 –

+0

是的,這是一個問題。我使用Chai很多,但我從不使用'should'接口,而且很少使用'expect'接口。當我爲已經使用它的第三方代碼貢獻時使用它。對於我自己的代碼,我使用'assert'接口。它不會嘗試對屬性做任何魔法,所以如果使用錯誤的方法名稱,它會失敗。 – Louis

相關問題