我正在试图弄清楚(还没有成功)是否有可能检查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', []);
我需要检查传递给此函数的数组是否为空,我该如何实现?另外,如果可能,我如何检查传递给此函数的数组是否包含我想要的字符串?
谢谢!
答案 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之前传入一个存储参数的函数。然后参数可以用于以后的期望测试。