我查看了Jasmine的toHaveBeenCalledWith匹配器文档,以了解是否有可能为参数传递正则表达式(如果该参数预期为字符串)。不幸的是,这是不受支持的功能。github上还存在一个请求此功能的问题。
我已经对代码库进行了一些研究,并且看到了如何在现有Matcher中实现这一点。我认为将其实现为单独的匹配器会更合适,这样可以分别捕获抽象。
同时,有什么好的解决方法?
我查看了Jasmine的toHaveBeenCalledWith匹配器文档,以了解是否有可能为参数传递正则表达式(如果该参数预期为字符串)。不幸的是,这是不受支持的功能。github上还存在一个请求此功能的问题。
我已经对代码库进行了一些研究,并且看到了如何在现有Matcher中实现这一点。我认为将其实现为单独的匹配器会更合适,这样可以分别捕获抽象。
同时,有什么好的解决方法?
Answers:
进行一些挖掘之后,我发现Jasmine间谍对象具有一个calls
属性,该属性又具有mostRecent()函数。此函数还具有child属性args
,该属性返回调用参数的数组。
因此,当要检查字符串参数是否匹配特定的正则表达式时,可以使用以下序列对调用参数执行正则表达式匹配:
var mySpy = jasmine.createSpy('foo');
mySpy("bar", "baz");
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/);
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);
非常简单。
从Jasmine 2.2开始,您可以使用jasmine.stringMatching
:
var mySpy = jasmine.createSpy('foo');
mySpy('bar', 'baz');
expect(mySpy).toHaveBeenCalledWith(
jasmine.stringMatching(/bar/),
jasmine.stringMatching(/baz/)
);
在Jasmine 2.0中,签名有所变化。在这里是:
var mySpy = jasmine.createSpy('foo');
mySpy("bar", "baz");
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/);
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);
Jasmine 1.3的文档已移动。
或者,如果您监视对象的方法:
spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
obj.method.calls.argsFor(index)
,仍然是Array。
obj.method['calls']['argsFor'](index)
来进行类型检查
有时以这种方式编写它更容易阅读:
spyOn(obj, 'method').and.callFake(function(arg1, arg2) {
expect(arg1).toMatch(/bar/);
expect(arg2).toMatch(/baz/);
});
obj.method('bar', 'baz');
expect(obj.method).toHaveBeenCalled();
它使方法参数更清晰可见(而不是使用数组)
.argsForCall
and.args