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

epi*_*tka 49 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;
}
Run Code Online (Sandbox Code Playgroud)

我想测试以下功能:

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;
           }
       });
}
Run Code Online (Sandbox Code Playgroud)

我如何保留承诺,以便当我调用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);

});
Run Code Online (Sandbox Code Playgroud)

Yu *_*ang 59

在当前的sinon版本v2.3.1中,您可以使用stub.resolves(value)stub.rejects(value)运行

例如,您可以使用以下代码将myClass.myFunction存根

sinon.stub(myClass, 'myFunction').resolves('the value you want to return');
Run Code Online (Sandbox Code Playgroud)

要么

sinon.stub(myClass, 'myFunction').rejects('the error information you want to return');
Run Code Online (Sandbox Code Playgroud)


And*_*rle 23

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

var resolveStub = sinon.stub(deferred, "resolve");
Run Code Online (Sandbox Code Playgroud)

您将使用虚假的响应数据解决延期问题

deferred.resolve({insureds: results103})
Run Code Online (Sandbox Code Playgroud)

  • 实际上,我就是这样做的:`var resolveStub = sinon.stub(deferred,"resolve").returns({then:function(){}});` (13认同)
  • 这与我们现在使用的承诺不一致.[Promises/A + say](https://promisesaplus.com/)"在执行上下文堆栈仅包含平台代码之前,不得调用onFulfilled或onRejected". (3认同)

Wto*_*wer 7

我有类似的情况,接受的答案和评论不起作用,但随着这个问题,他们帮助我以下面的方式解决这个问题.我希望它对某人有帮助.

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'));
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)