Подтвердить что ты не робот

Как один зажим обещает синус?

У меня есть служба данных со следующей функцией

function getInsureds(searchCriteria) {

    var deferred = $q.defer();

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

    return deferred.promise;
}

Я хочу проверить следующую функцию:

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

Как я закрою обещание, чтобы, когда я позвоню getInsureds, он разрешит обещание и сразу же вернет мне результаты. Я начал так (тест на жасмин), но я застрял, так как не знаю, как решить обещание и передать необходимые аргументы.

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

});
4b9b3361

Ответ 1

Вам просто нужно решить обещание, прежде чем вы вызовете функцию поиска. Таким образом, ваш заглушка вернет обещанное обещание, и then будет вызываться немедленно. Поэтому вместо

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

вы разрешите отсрочку с вашими данными поддельного ответа

deferred.resolve({insureds: results103})

Ответ 2

В текущей версии синона v2.3.1 вы можете использовать stub.resolves(value) и stub.rejects(value) функцию

Например, вы можете заглушить myClass.myFunction со следующим кодом

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

или

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

Ответ 3

У меня была аналогичная ситуация, и принятый ответ и комментарии не работали, но вместе с этим вопросом они помогли мне решить эту проблему следующим образом. Надеюсь, это полезно для кого-то.

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

Ответ 4

Там появилась еще одна альтернатива. Большая боль, чем другие методы.

Вы можете использовать этот пакет npm: sinon-stub-promise.

Он абстрагирует большую часть деталей, так что вам не нужно снова изобретать колесо. Помог мне написать мои тесты, пытаясь долго симулировать обещание.

Надеюсь, что это поможет!