我有一个函数我想测试它两次调用外部 API 方法,使用不同的参数。我想用 Jasmine spy 模拟这个外部 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;
      }
    });
  });
});

最佳答案

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

  • 资源:
  • withArgs docs
  • callFake docs
  • andCallFake vs and.callFake
  • 关于javascript - 有什么方法可以根据参数修改 Jasmine spy ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16198353/

    10-13 01:10