2013-12-12 51 views
36

我有一個數據服務具有以下功能一個stub與sinon的承諾如何?

function getInsureds(searchCriteria) { 

    var deferred = $q.defer(); 

    insuredsSearch.get(searchCriteria, 
     function (insureds) { 
      deferred.resolve(insureds); 
     }, 
     function (response) { 
      deferred.reject(response); 
     }); 

    return deferred.promise; 
} 

我想測試以下功能:

function search() 
{ 
    dataService 
     .getInsureds(vm.searchCriteria) 
     .then(function (response) { 
      vm.searchCompleted = true; 

      if (response.insureds.length > 100) { 
       vm.searchResults = response.insureds.slice(0, 99); 
      } else { 
       vm.searchResults = response.insureds; 
      } 
     }); 
} 

我將如何存根的承諾,這樣,當我把getInsureds它將解決的承諾和回報我馬上得到結果。我開始像這樣(茉莉花測試),但我被卡住了,因爲我不知道如何解決承諾並傳遞所需的論據。

it("search returns over 100 results searchResults should contain only 100 records ", function() { 

    var results103 = new Array(); 

    for (var i = 0; i < 103; i++) { 
     results103.push(i); 
    } 

    var fakeSearchForm = { $valid: true }; 
    var isSearchValidStub = sinon.stub(sut, "isSearchCriteriaValid").returns(true); 

    var deferred = $q.defer(); 
    var promise = deferred.promise; 
    var dsStub = sinon.stub(inSearchDataSvc, "getInsureds").returns(promise); 

    var resolveStub = sinon.stub(deferred, "resolve"); 

    //how do i call resolve and pass in results103 

    sut.performSearch(fakeSearchForm); 

    sinon.assert.calledOnce(isSearchValidStub); 
    sinon.assert.calledOnce(dsStub); 

    sinon.assert.called(resolveStub); 

    expect(sut.searchResults.length).toBe(100); 

}); 

回答

16

您只需要在調用搜索功能之前解決承諾。這樣你的存根將返回一個已解決的承諾,並且將立即調用then。因此,而不是

var resolveStub = sinon.stub(deferred, "resolve"); 

你會解決您的假響應數據

deferred.resolve({insureds: results103}) 
+3

存根myClass.myFunction不同意我們現在使用的承諾。 [Promises/A + say](https://promisesaplus.com/)「只有當執行上下文堆棧只包含平臺代碼時,才能調用onFulfilled或onRejected」。 – Kos

+12

實際上,這是我做的:var resolveStub = sinon.stub(deferred,「resolve」)。returns({then:function(){}});' –

5

遞延我也有類似的情況,並接受的答案和評論不是工作,而是與this question沿着他們幫我解決這以下面的方式。我希望這有助於某人。

var Promise = require('bluebird'); 

var deferred = Promise.defer(); 
stub = sinon.stub(deferred, 'resolve').returns(deferred.promise); 

deferred.resolve({data: data}); 
// or 
deferred.reject(new Error('fake error')); 
+1

這節省了我的一天:) –

1

還有一個我找到的替代方案。比其他方法無痛無痛。

你可以使用這個npm包:sinon-stub-promise

它抽象了大部分細節,所以你不必再次發明輪子。在努力模擬長期承諾之後,幫助我編寫測試。

希望它有幫助!

15

在當前版本興農V2.3.1,您可以使用stub.resolves(value)stub.rejects(value)功能

例如,你可以用下面的代碼

sinon.stub(myClass, 'myFunction').resolves('the value you want to return'); 

sinon.stub(myClass, 'myFunction').rejects('the error information you want to return');