一个存根如何与sinon保证一致?

时间:2013-12-12 22:06:21

标签: javascript jasmine sinon

我有一个具有以下功能的数据服务

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

});

5 个答案:

答案 0 :(得分:43)

在当前的sinon版本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');

答案 1 :(得分:21)

您必须在调用搜索功能之前解决该承诺。这样,您的存根将返回已解决的承诺,并立即调用then。而不是

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

您将使用虚假回复数据解决延期

deferred.resolve({insureds: results103})

答案 2 :(得分:7)

我有类似的情况,接受的答案和评论不起作用,但与this question一起帮助我以下列方式解决了这个问题。我希望它对某人有帮助。

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

答案 3 :(得分:5)

您还可以执行以下操作:

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

答案 4 :(得分:1)

我发现了另外一种选择。比其他方法痛苦得多。

您可以使用此npm包:sinon-stub-promise

它抽象了大部分细节,因此你不必再发明轮子。在努力模拟一个很长的承诺之后帮助我写了我的测试。

希望它有所帮助!