2013-12-12 52 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');