我已经查看了 Jasmine 的toHaveBeenCalledWith匹配器文档,以了解是否可以为参数传递正则表达式,如果该参数预期为字符串。不幸的是,这是不受支持的功能。在 github上还存在一个请求此功能的问题。
我已经对代码库进行了一些研究,并且看到了如何在现有的 matcher中实现它。我认为将它实现为单独的匹配器会更合适,以便单独捕获抽象。
与此同时,什么可能是一个好的解决方法?
我已经查看了 Jasmine 的toHaveBeenCalledWith匹配器文档,以了解是否可以为参数传递正则表达式,如果该参数预期为字符串。不幸的是,这是不受支持的功能。在 github上还存在一个请求此功能的问题。
我已经对代码库进行了一些研究,并且看到了如何在现有的 matcher中实现它。我认为将它实现为单独的匹配器会更合适,以便单独捕获抽象。
与此同时,什么可能是一个好的解决方法?
经过一番挖掘,我发现Jasmine 间谍对象具有一个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/);
很简单。
从 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/);
有时以这种方式编写它更具可读性:
spyOn(obj, 'method').and.callFake(function(arg1, arg2) {
expect(arg1).toMatch(/bar/);
expect(arg2).toMatch(/baz/);
});
obj.method('bar', 'baz');
expect(obj.method).toHaveBeenCalled();
它提供了更清晰的方法参数可见性(而不是使用数组)
正如 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/);