我有一个函数我想测试它两次调用外部 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 的版本,语法略有不同:
.andCallFake(fn)
.and.callFake(fn)
资源:
关于javascript - 有什么方法可以根据参数修改 Jasmine spy ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16198353/