2013-12-12 17 views
36

Mam usługi danych z następujących funkcjiW jaki sposób jedna obietnica z sinonem?

function getInsureds(searchCriteria) { 

    var deferred = $q.defer(); 

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

    return deferred.promise; 
} 

Chcę przetestować następujące czynności:

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

Jak bym skrótową obietnicę tak, że gdy zgłoszę getInsureds byłoby rozwiązać obietnicę i powrotu mi wyniki natychmiast. Zacząłem w ten sposób (test jaśminowy), ale utknąłem, ponieważ nie wiem, jak rozwiązać obietnicę i przekazać potrzebne argumenty.

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

}); 

Odpowiedz

16

Musisz tylko rozwiązać obietnicę, zanim zadzwonisz do funkcji wyszukiwania. W ten sposób Twój kod pośredniczący zwróci ustaloną obietnicę i natychmiast zostanie wywołana. Więc zamiast

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

można rozwiązać odroczonego ze swoimi fałszywymi danymi odpowiedzi

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

ten nie zgadza się z obietnicami, których obecnie używamy. [Promises/A + say] (https://promisesaplus.com/) "onFulfilled lub onRejected nie mogą być wywoływane, dopóki stos kontekstowy wykonania nie zawiera tylko kodu platformy". – Kos

+12

Tak właśnie to zrobiłem: 'var resolveStub = sinon.stub (odroczone," postanowienie "). Zwraca ({then: function() {}});' –

5

miałem podobną sytuację i zaakceptowane odpowiedzi i komentarze nie działały, ale wraz z this question pomogli mi rozwiązać to w następujący sposób. Mam nadzieję, że jest to pomocne dla kogoś.

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

To uratowało mój dzień :) –

1

Jest jeszcze jedna alternatywa, którą znalazłem. Wiele bezbolesny niż inne metody. Możesz użyć tego pakietu npm: sinon-stub-promise.

Wykreśla wiele szczegółów, dzięki czemu nie trzeba już wymyślać koła. Pomógł mi napisać moje testy po tym, jak długo starałem się zasymulować obietnicę.

Mam nadzieję, że pomoże!

15

W aktualnej wersji sinon v2.3.1, można użyć stub.resolves(value) i stub.rejects(value) funkcję

Na przykład, można skrótową myClass.myFunction z następującym kodem

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

lub

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