32

假设我有

spyOn($cookieStore,'get').and.returnValue('abc');

这对我的用例来说太笼统了。任何时候我们打电话

$cookieStore.get('someValue') -->  returns 'abc'
$cookieStore.get('anotherValue') -->  returns 'abc'

我想设置一个 spyOn,以便根据参数获得不同的返回:

$cookieStore.get('someValue') -->  returns 'someabc'
$cookieStore.get('anotherValue') -->  returns 'anotherabc'

有什么建议么?

4

3 回答 3

46

您可以使用callFake

spyOn($cookieStore,'get').and.callFake(function(arg) {
    if (arg === 'someValue'){
        return 'someabc';
    } else if(arg === 'anotherValue') {
        return 'anotherabc';
    }
});
于 2016-07-08T10:41:45.990 回答
18

对于使用 jasmine 3 及以上版本的用户,您可以使用类似于 sinon stubs 的语法来实现:

spyOn(componentInstance, 'myFunction')
      .withArgs(myArg1).and.returnValue(myReturnObj1)
      .withArgs(myArg2).and.returnValue(myReturnObj2);

详情见:https ://jasmine.github.io/api/edge/Spy#withArgs

于 2020-07-16T19:29:49.960 回答
0

实现相同结果的另一种方法是....(理想情况下,当您在不使用测试平台的情况下编写单元测试时)在根描述块中声明间谍

const storageServiceSpy = jasmine.createSpyObj('StorageService',['getItem']);

并在构造函数中注入这个间谍代替原始服务

service = new StoragePage(storageServiceSpy)

在 it() 块内...

storageServiceSpy.getItem.withArgs('data').and.callFake(() => {})
于 2021-12-22T18:59:38.037 回答