我有一个要测试的函数,它使用不同的参数两次调用外部 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; } }); }); });
在 Jasmine 3.0 及更高版本中,您可以使用withArgs
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是正确的方法,但您可以使用对象来保存返回值来简化它
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 的版本,语法略有不同:
.andCallFake(fn)
.and.callFake(fn)