有办法根据争论改变茉莉花间谍吗?

我有一个想要测试的函数,它使用不同的参数两次调用外部 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;
}
});
});
});
131352 次浏览

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

资源:

您还可以使用 $provide来创建一个间谍。使用 and.returnValues而不是 and.returnValue传递参数化数据。

根据 Jasmine 文档: 通过用 and.returnValues链接间谍,所有对函数的调用都将按顺序返回特定的值,直到它到达返回值列表的末尾,此时它将返回所有后续调用的未定义值。

describe('my fn', () => {
beforeEach(module($provide => {
$provide.value('externalApi', jasmine.createSpyObj('externalApi', ['get']));
}));


it('get userName and Id', inject((externalApi) => {
// Given
externalApi.get.and.returnValues('abc','123');


// When
//insert your condition


// Then
// insert the expectation
}));
});

在我的例子中,我有一个正在测试的组件,在它的构造函数中,有一个带有一个名为 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 中指定的签名相同,就可以修改函数内部执行的操作。