2016-01-23 91 views
0

我堅持測試在柴和Sinon的先例。一般來說,我得到的服務是xhr請求的包裝,它返回承諾。我想這樣來測試它:測試承諾的服務與柴和Sinon

beforeEach(function() { 
    server = sinon.fakeServer.create(); 
}); 

afterEach(function() { 
    server.restore(); 
}); 

describe('task name', function() { 
    it('should respond with promise error callback', function(done) { 

     var spy1 = sinon.spy(); 
     var spy2 = sinon.spy(); 

     service.get('/someBadUrl').then(spy1, spy2); 

     server.respond(); 
     done(); 

     expect(spy2.calledOnce).to.be.true; 
     expect(sp2.args[0][1].response.to.equal({status: 404, text: 'Not Found'}); 
    }); 
}); 

我的筆記一下:

// spy2之後被稱爲預計完成斷言
//試圖用var timer = sinon.useFakeTimers()timer.tick(510);沒有結果
//嘗試與柴作爲許諾的 - 不知道如何使用它:-(
//在我的環境不能安裝sinon-as-promised只能選擇NPM模塊

任何想法如何修復此代碼/測試此服務模塊?

+1

你調用'()完成'你的斷言之前,而當你的測試已經完全結束它應該被稱爲。另外,是'service.get()'同步還是異步? – robertklep

+0

@robertklep:好的,我不知道最後完成了()。 'service.get'是異步的(用於D3 XHR的包裝) – cachaito

回答

1

有各種各樣的挑戰在這裏:

  • 如果service.get()是異步的,你需要等待檢查你的斷言前建成;
  • 由於(建議的)解決方案檢查承諾處理程序中的斷言,因此必須小心異常。而不是使用done(),我會選擇使用Mocha的(我假設你使用的)內置承諾支持。

試試這個:

it('should respond with promise error callback', function() { 
    var spy1 = sinon.spy(); 
    var spy2 = sinon.spy(); 

    // Insert the spies as resolve/reject handlers for the `.get()` call, 
    // and add another .then() to wait for full completion. 
    var result = service.get('/someBadUrl').then(spy1, spy2).then(function() { 
    expect(spy2.calledOnce).to.be.true; 
    expect(spy2.args[0][1].response.to.equal({status: 404, text: 'Not Found'})); 
    }); 

    // Make the server respond. 
    server.respond(); 

    // Return the result promise. 
    return result; 
}); 
+0

它工作正常!謝謝@robertklep。 – cachaito

相關問題