web-dev-qa-db-ja.com

引数に基づいてジャスミンのスパイを変更する方法はありますか?

異なるパラメーターを使用して外部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;
      }
    });
  });
});
119
Jmr

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

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)

リソース:

168

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