web-dev-qa-db-ja.com

1つのスタブはどのようにシノンと約束しますか?

私は次の機能を持つデータサービスを持っています

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

});
47
epitka

検索機能を呼び出す前に、約束を解決する必要があります。これにより、スタブは解決されたプロミスを返し、thenがすぐに呼び出されます。代わりに

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

偽の応答データで遅延を解決します

deferred.resolve({insureds: results103})
22

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

私は同様の状況にあり、受け入れられた答えとコメントは機能しませんでしたが、 この質問 と一緒に、次の方法でこれを解決するのに役立ちましたそれが誰かに役立つことを願っています。

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

また、次のようなこともできます:

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

私が見つけたもう一つの選択肢があります。他の方法よりも痛みが少ない。

このnpmパッケージを使用できます: sinon-stub-promise

詳細の多くが抽象化されているので、もう一度車輪を発明する必要はありません。長い間約束をシミュレートするのに苦労した後、私のテストを書くのを助けました。

それが役に立てば幸い!

1
tbking