有什么方法可以根据参数修改茉莉花间谍吗?

2022-08-30 01:38:16

我有一个函数,我想测试它使用不同的参数调用外部API方法两次。我想用Jasmine间谍来嘲笑这个外部API,并根据参数返回不同的东西。有什么办法可以在茉莉花中做到这一点吗?我能想到的最好的方法是使用和CallFake的黑客攻击:

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

答案 1

在茉莉花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)

资源:


答案 2

您也可以使用来创建间谍。并模拟使用而不是传递参数化数据。$provideand.returnValuesand.returnValue

根据茉莉花文档:通过将 spy 与 链接,对函数的所有调用将按顺序返回特定值,直到它到达返回值列表的末尾,此时它将为所有后续调用返回未定义。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                
        }));
});