web-dev-qa-db-fra.com

Comment un talon promet-il avec sinon?

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

});
47
epitka

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})
22
Andreas Köberle

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');
52
Yu Huang

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

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
5
aH6y

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!

1
tbking