J'ai un service de données avec la fonction suivante
function getInsureds(searchCriteria) {
var deferred = $q.defer();
insuredsSearch.get(searchCriteria,
function (insureds) {
deferred.resolve(insureds);
},
function (response) {
deferred.reject(response);
});
return deferred.promise;
}
Je veux tester la fonction suivante:
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;
}
});
}
Comment pourrais-je tenir la promesse de telle sorte que, lorsque j'appellerais getInsureds, cela résoudrait la promesse et me renverrait immédiatement les résultats. J'ai commencé comme ça (test au jasmin), mais je suis coincé, car je ne sais pas comment résoudre la promesse et transmettre les arguments nécessaires.
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);
});
Il vous suffit de résoudre la promesse avant d'appeler la fonction de recherche. De cette façon, votre souche renverra une promesse résolue et then
sera appelé immédiatement. Donc au lieu de
var resolveStub = sinon.stub(deferred, "resolve");
vous allez résoudre le différé avec vos fausses données de réponse
deferred.resolve({insureds: results103})
A la version actuelle v2.3.1 sinon, vous pouvez utiliser stub.resolves(value)
et stub.rejects(value)
fonction
Par exemple, vous pouvez remplacer myClass.myFunction avec le code suivant
sinon.stub(myClass, 'myFunction').resolves('the value you want to return');
ou
sinon.stub(myClass, 'myFunction').rejects('the error information you want to return');
J'ai eu une situation similaire et la réponse acceptée et les commentaires ne fonctionnaient pas, mais avec cette question ils m'ont aidé à résoudre ce problème de la manière suivante. J'espère que c'est utile pour quelqu'un.
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'));
Aussi, vous pouvez faire quelque chose comme ça:
import sinon from 'sinon';
const sandbox = sinon.sandbox.create();
const promiseResolved = () => sandbox.stub().returns(Promise.resolve('resolved'));
const promiseRejected = () => sandbox.stub().returns(Promise.reject('rejected'));
const x = (promise) => {
return promise()
.then((result) => console.log('result', result))
.catch((error) => console.log('error', error))
}
x(promiseResolved); // resolved
x(promiseRejected); // rejected
Il y a une autre alternative que j'ai trouvée. Beaucoup de douleur libre que d'autres méthodes.
Vous pouvez utiliser ce paquet npm: sinon-stub-promise .
Cela résume une grande partie des détails, de sorte que vous n'avez pas à réinventer la roue. M'a aidé à écrire mes tests après avoir eu du mal à simuler une promesse pendant longtemps.
J'espère que ça aide!