2013-12-12 22 views
36

Tôi có một dịch vụ dữ liệu với chức năng sauLàm thế nào để một lời hứa với sinon?

function getInsureds(searchCriteria) { 

    var deferred = $q.defer(); 

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

    return deferred.promise; 
} 

Tôi muốn thử nghiệm chức năng sau:

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; 
      } 
     }); 
} 

Làm thế nào tôi sẽ còn sơ khai hứa hẹn để khi tôi gọi getInsureds nó sẽ giải quyết lời hứa và trở lại cho tôi kết quả ngay lập tức. Tôi bắt đầu như thế này (thử nghiệm hoa nhài), nhưng tôi bị mắc kẹt, vì tôi không biết làm thế nào để giải quyết lời hứa và vượt qua trong các đối số cần thiết.

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); 

}); 

Trả lời

16

Bạn chỉ cần giải quyết lời hứa trước khi gọi chức năng tìm kiếm. Bằng cách này, bài khai của bạn sẽ trả về một lời hứa đã được giải quyết và then sẽ được gọi ngay lập tức. Vì vậy, thay vì

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

bạn sẽ giải quyết chậm với dữ liệu đáp ứng giả của bạn

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

này không đồng ý với những lời hứa chúng tôi đang sử dụng ngày nay. [Lời hứa/A + nói] (https://promisesaplus.com/) "onFulfilled hoặc onRejected không được gọi cho đến khi ngăn xếp ngữ cảnh thực thi chỉ chứa mã nền tảng". – Kos

+12

Thực ra, đây là cách tôi đã làm: 'var resolveStub = sinon.stub (hoãn lại," giải quyết "). Return ({then: function() {}});' –

5

tôi đã có một tình huống tương tự và câu trả lời chấp nhận và ý kiến ​​đã không làm việc, nhưng cùng với this question họ đã giúp tôi giải quyết điều này theo cách sau. Tôi hy vọng nó hữu ích cho ai đó.

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

Điều này đã lưu ngày của tôi :) –

1

Có một lựa chọn thay thế khác mà tôi đã tìm thấy. Nhiều đau miễn phí so với các phương pháp khác.

Bạn có thể sử dụng gói npm này: sinon-stub-promise.

Nó tóm tắt nhiều chi tiết để bạn không phải phát minh ra bánh xe nữa. Giúp tôi viết bài kiểm tra của tôi sau khi đấu tranh để mô phỏng một lời hứa lâu.

Hy vọng điều đó sẽ hữu ích!

15

Tại hiện tại phiên bản Sinon v2.3.1, bạn có thể sử dụng stub.resolves(value)stub.rejects(value) chức năng

Ví dụ, bạn có thể còn sơ khai myClass.myFunction với mã sau đây

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

hoặc

sinon.stub(myClass, 'myFunction').rejects('the error information you want to return'); 
Các vấn đề liên quan