187

異なるパラメーターを使用して、外部 API メソッドを 2 回呼び出すテストしたい関数があります。この外部 API を Jasmine スパイでモック化し、パラメーターに基づいてさまざまなものを返したいと思います。ジャスミンでこれを行う方法はありますか? 私が思い付くことができる最善の方法は、andCallFake を使用したハックです。

var functionToTest = function() {
  var userName = externalApi.get('abc');
  var userId = externalApi.get('123');
};


describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').andCallFake(function(myParam) {
      if (myParam == 'abc') {
        return 'Jane';
      } else if (myParam == '123') {
        return 98765;
      }
    });
  });
});
4

3 に答える 3

275

Jasmine バージョン 3.0 以降では、使用できますwithArgs

describe('my fn', function() {
  it('gets user name and ID', function() {
    spyOn(externalApi, 'get')
      .withArgs('abc').and.returnValue('Jane')
      .withArgs('123').and.returnValue(98765);
  });
});

Jasmine のバージョンが 3.0 より前の場合callFakeは正しい方法ですが、戻り値を保持するオブジェクトを使用して単純化できます。

describe('my fn', function() {
  var params = {
    'abc': 'Jane', 
    '123': 98765
  }

  it('gets user name and ID', function() {
    spyOn(externalApi, 'get').and.callFake(function(myParam) {
     return params[myParam]
    });
  });
});

Jasmine のバージョンによって、構文が若干異なります。

  • 1.3.1:.andCallFake(fn)
  • 2.0:.and.callFake(fn)

資力:

于 2013-04-25T06:45:52.397 に答える
12

$provideスパイの作成にも使用できます。そして、パラメータ化されたデータを渡すand.returnValues代わりに使用してモックします。and.returnValue

Jasmine docs に従って:スパイをand.returnValuesでチェーンすることにより、関数へのすべての呼び出しは、戻り値リストの最後に到達するまで特定の値を順番に返します。

describe('my fn', () => {
    beforeEach(module($provide => {
        $provide.value('externalApi', jasmine.createSpyObj('externalApi', ['get']));
    }));

        it('get userName and Id', inject((externalApi) => {
            // Given
            externalApi.get.and.returnValues('abc','123');

            // When
            //insert your condition

            // Then
            // insert the expectation                
        }));
});
于 2016-11-15T06:17:33.567 に答える