任何方式来修改茉莉花间谍基于参数?

我有一个函数我想testing哪个调用外部API方法两次,使用不同的参数。 我想用Jasmine间谍来嘲笑这个外部的API,并根据参数返回不同的东西。 有没有办法在茉莉花做到这一点? 我能想到的最好的方法就是使用和CallCake进行破解:

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; } }); }); }); 

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)

资源:

  • callFake文档
  • 和CallFake vs和.CallFake

你也可以使用$provide来创build一个间谍。 和模拟使用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 })); });