Javascript 有没有办法根据论点修改Jasmine间谍?
我想测试一个函数,它使用不同的参数调用外部API方法两次。我想用Jasmine spy模拟这个外部API,并根据参数返回不同的内容。茉莉花有什么办法可以做到这一点吗?我能想出的最好办法就是使用andCallFake进行黑客攻击:Javascript 有没有办法根据论点修改Jasmine间谍?,javascript,unit-testing,jasmine,Javascript,Unit Testing,Jasmine,我想测试一个函数,它使用不同的参数调用外部API方法两次。我想用Jasmine spy模拟这个外部API,并根据参数返回不同的内容。茉莉花有什么办法可以做到这一点吗?我能想出的最好办法就是使用andCallFake进行黑客攻击: var functionToTest = function() { var userName = externalApi.get('abc'); var userId = externalApi.get('123'); }; describe('my fn'
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及以上版本中,您可以使用带有args的
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:
和callfake(fn)
- 2.0:
和.callFake(fn)
- 您还可以使用
$provide
创建间谍。并使用和.returnValue
而不是和.returnValue
来模拟传递参数化数据
根据Jasmine docs:通过将spy与和.returnValues
链接,对函数的所有调用将按顺序返回特定值,直到它到达返回值列表的末尾,此时它将为所有后续调用返回未定义的值
在我的例子中,我有一个正在测试的组件,在它的构造函数中,有一个配置服务,其方法名为getAppConfigValue,它被调用两次,每次都使用不同的参数:
constructor(private configSvc: ConfigService) {
this.configSvc.getAppConfigValue('a_string');
this.configSvc.getAppConfigValue('another_string');
}
在我的规范中,我在测试床中提供了ConfigService,如下所示:
{
provide: ConfigService,
useValue: {
getAppConfigValue: (key: any): any {
if (key === 'a_string) {
return 'a_value';
} else if (key === 'another_string') {
return 'another_value';
}
}
} as ConfigService
}
因此,只要getAppConfigValue的签名与实际ConfigService中指定的签名相同,就可以修改函数的内部功能。现在是
和.callFake
->我必须返回不同的承诺,因此返回看起来略有不同:返回q.when(params[myParam]);。否则,这就是解决我问题的关键。我梦想的解决方案是改变“and.returnValue”调用。感觉jasmine应该有更好的方式来声明这一点。例如spyOn(假,'method')。withArgs('abc')。和.returnValue('Jane')
和spyOn(假,'method')。withArgs('123')。和.returnValue(98765)
@jrharshath。withArgs
在jasmine 2.0中对我不起作用。withArgs
实际上不可用-我的意思是,这样的方法在编写测试时是有意义的。这是正确的答案,因为测试应该始终准确地知道如何调用间谍,因此,应该只使用returnValues
来支持多个调用必须澄清akhouri的答案:此方法仅在it
函数中调用externalApi.get.and.returnValues('abc','123')
时有效。否则,如果您设置了一个值列表,那么它将永远不会工作,因为运行测试的顺序是不可预测的。事实上,测试不应该依赖于它们的执行顺序。为什么你觉得和.callFake
是一种黑客行为?对我来说,这似乎是一个很好/最好的答案。
{
provide: ConfigService,
useValue: {
getAppConfigValue: (key: any): any {
if (key === 'a_string) {
return 'a_value';
} else if (key === 'another_string') {
return 'another_value';
}
}
} as ConfigService
}