我已经回顾了Jasmine的toHaveBeenCalledWith匹配器的文档,以便了解是否可以为参数传递正则表达式,如果该参数应该是一个字符串。不幸的是,这是不受支持的功能。还有issue open on github请求此功能。
我已经挖了一些代码库,我看到如何在existing matcher内实现它。我认为将它作为一个单独的匹配器实现更合适,这样就可以单独捕获抽象。
与此同时,什么可能是一个好的解决方法?
答案 0 :(得分:80)
在进行一些挖掘之后,我发现Jasmine spy个对象具有calls
属性,而该属性又具有mostRecent()功能。该函数还有一个子属性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/);
非常简单。
答案 1 :(得分:22)
在Jasmine 2.0中signature changed a bit。这将是:
var mySpy = jasmine.createSpy('foo');
mySpy("bar", "baz");
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/);
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);
答案 2 :(得分:15)
从Jasmine 2.2开始,您可以使用jasmine.stringMatching
:
var mySpy = jasmine.createSpy('foo');
mySpy('bar', 'baz');
expect(mySpy).toHaveBeenCalledWith(
jasmine.stringMatching(/bar/),
jasmine.stringMatching(/baz/)
);
答案 3 :(得分:12)
或者,如果您正在监视对象上的方法:
spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
答案 4 :(得分:6)
正如jammon所说,Jasmine 2.0签名已经改变。如果你正在监视Jasmine 2.0中对象的方法,那么Nick的解决方案应该改为使用类似的东西 -
spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.calls.mostRecent().args[0]).toMatch(/bar/);
expect(obj.method.calls.mostRecent().args[1]).toMatch(/baz/);
答案 5 :(得分:5)
有时用这种方式写它会更具可读性:
spyOn(obj, 'method').and.callFake(function(arg1, arg2) {
expect(arg1).toMatch(/bar/);
expect(arg2).toMatch(/baz/);
});
obj.method('bar', 'baz');
expect(obj.method).toHaveBeenCalled();
它提供了更清晰的方法参数可见性(而不是使用数组)