1. ホーム
  2. javascript

[解決済み] 引数に基づいてJasmineのスパイを修正する方法はありますか?

2022-04-16 22:42:09

質問

外部APIメソッドを異なるパラメータで2回呼び出す関数をテストしたいのですが、どうすればいいですか?この外部APIをJasmineのスパイでモックし、パラメータに基づいて異なるものを返したいと思っています。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;
      }
    });
  });
});

解決方法は?

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)

リソースです。