是否可以将Jasmine的toHaveBeenCalledWith匹配器与正则表达式一起使用?


70

我查看了Jasmine的toHaveBeenCalledWith匹配器文档,以了解是否有可能为参数传递正则表达式(如果该参数预期为字符串)。不幸的是,这是不受支持的功能。github上还存在一个请求此功能的问题。

我已经对代码库进行了一些研究,并且看到了如何在现有Matcher中实现这一点。我认为将其实现为单独的匹配器会更合适,这样可以分别捕获抽象。

同时,有什么好的解决方法?

Answers:


89

进行一些挖掘之后,我发现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/);

非常简单。


34

从Jasmine 2.2开始,您可以使用jasmine.stringMatching

var mySpy = jasmine.createSpy('foo');
mySpy('bar', 'baz');
expect(mySpy).toHaveBeenCalledWith(
  jasmine.stringMatching(/bar/),
  jasmine.stringMatching(/baz/)
);

2
如果您使用的是最新的茉莉花,这应该是公认的解决方案。尝试使用.argsForCalland.args
dzylich

6
这就是为什么我的默认答案视图为“有效”而不是“投票”的原因。
保罗·奥利佛

24

在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文档已移动。


12

或者,如果您监视对象的方法:

spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
expect(obj.method.argsForCall[0][1]).toMatch(/baz/);

5
在Jasmine 2.0中,语法为obj.method.calls.argsFor(index),仍然是Array。
Dr1Ku 2015年

如果您尝试使用成角度(2+)字体,打字稿似乎不喜欢它,所以您可能必须使用方括号表示法obj.method['calls']['argsFor'](index)来进行类型检查
Crhistian Ramirez

7

正如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/);

7

有时以这种方式编写它更容易阅读:

spyOn(obj, 'method').and.callFake(function(arg1, arg2) {
    expect(arg1).toMatch(/bar/);
    expect(arg2).toMatch(/baz/);
});
obj.method('bar', 'baz');
expect(obj.method).toHaveBeenCalled();

它使方法参数更清晰可见(而不是使用数组)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.