2013-12-12 13 views
36

Ho un servizio di dati con funzione seguenteCome si promette uno stub con sinon?

function getInsureds(searchCriteria) { 

    var deferred = $q.defer(); 

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

    return deferred.promise; 
} 

Voglio testare seguente funzione:

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

Come faccio a stub la promessa in modo che quando chiamo getInsureds che risolverebbe la promessa e ritorno me i risultati immediatamente. Ho iniziato così (test al gelsomino), ma sono bloccato perché non so come risolvere la promessa e passare argomenti necessari.

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

}); 

risposta

16

Devi solo risolvere la promessa prima di chiamare la funzione di ricerca. In questo modo il tuo stub restituirà una promessa risolta e then sarà chiamato immediatamente. Così, invece di

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

si risolvere la differita con i tuoi dati di risposta falsi

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

Questo non è d'accordo con le promesse che stiamo usando al giorno d'oggi. [Promises/A + dire] (https://promisesaplus.com/) "onFulfilled o onRejected non deve essere chiamato fino a quando lo stack del contesto di esecuzione contiene solo il codice della piattaforma". – Kos

+12

In realtà, questo è il modo in cui l'ho fatto: 'var resolveStub = sinon.stub (deferred," resolve "). Returns ({then: function() {}})' –

5

ho avuto una situazione simile e la risposta accettata e commenti non funzionavano, ma insieme a this question hanno aiutato a risolvere questo nel modo seguente. Spero sia utile per qualcuno.

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

Questo mi ha salvato la giornata :) –

1

C'è un'altra alternativa che ho trovato. Molto privo di dolore rispetto ad altri metodi.

È possibile utilizzare questo pacchetto npm: sinon-stub-promise.

Estrae molti dei dettagli, in modo che non sia necessario inventare nuovamente la ruota. Ho aiutato a scrivere le mie prove dopo aver lottato per simulare una promessa a lungo.

Spero che aiuti!

15

alla versione corrente Sinon v2.3.1, è possibile utilizzare stub.resolves(value) e stub.rejects(value) funzione

Ad esempio, è possibile stub myClass.myFunction con seguente codice

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

o

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