Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法根据论点修改Jasmine间谍?_Javascript_Unit Testing_Jasmine - Fatal编程技术网

Javascript 有没有办法根据论点修改Jasmine间谍?

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'

我想测试一个函数,它使用不同的参数调用外部API方法两次。我想用Jasmine spy模拟这个外部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;
      }
    });
  });
});

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