小编典典

有什么方法可以根据参数修改 Jasmine spies?

all

我有一个要测试的函数,它使用不同的参数两次调用外部 API 方法。我想用 Jasmine 间谍模拟这个外部
API,并根据参数返回不同的东西。茉莉花有没有办法做到这一点?我能想到的最好的方法是使用 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;
      }
    });
  });
});

阅读 61

收藏
2022-07-28

共1个答案

小编典典

在 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 的 Jasmine 版本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)
2022-07-28