检查传递给函数的参数的属性我们spyOn

时间:2014-06-26 16:11:41

标签: javascript jasmine

我正在试图弄清楚(还没有成功)是否有可能检查js函数我是否正在尝试用spyOn(jasmine)模拟用我期望的确切参数调用,例如考虑函数:

foo = function(date, array) {};

到目前为止,我只能确保数组确实像这样传递:

spyOn(bar, 'foo').and.returnValue(somePromise.promise);
somePromise.resolve;
//call some function that calls 'foo' eventually...
expect(bar.foo).toHaveBeenCalledWith('10/12/2100', []);

我需要检查传递给此函数的数组是否为空,我该如何实现?另外,如果可能,我如何检查传递给此函数的数组是否包含我想要的字符串?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不认识Jasmine,所以这可能不是您正在寻找的答案。 另一方面,这是一个可行的工作,您可以在等待真实答案的同时实施。

如果您可以控制foo,那么在foo方法中,您可以告诉它将全局变量设置为其输入参数:

var fooParam;

var foo = function(array){
   fooParam = array;
}

然后在您的其他代码中,您可以执行以下操作:

if (fooParam != null){
   if (fooParam.contains(yourString)){
       //I'm not sure if "contains" is actually a method or not, 
       //but that's really a separate issue.
   }
}

因此,您可以在fooParam方法中设置全局变量foo,然后稍后可以使用它进行检查。

因此,您可能无法控制foo,例如,如果它是系统方法,则存在潜在问题。要解决此问题,请将foo的所有调用替换为foo2之类的内容,您可以将其定义为具有相同的参数,并且只需调用foo并设置全局变量。但是如果你控制了foo,那么你就不需要这样做了。

另一个潜在的问题是foo将被多次调用(例如,如果它在循环内被调用)。为了避免这种情况,您可以将全局变量设置为数组列表,并使foo将其参数添加到数组列表中,而不是设置变量。但是如果它没有被循环调用,或者在被处理之前没有多次调用,那么你就不需要这样做了。

我希望在您寻找真正的答案时这会有所帮助

答案 1 :(得分:1)

and.returnValue替换为and.callFake,然后在返回promise之前传入一个存储参数的函数。然后参数可以用于以后的期望测试。