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

76

我已经查阅了Jasmine的toHaveBeenCalledWith匹配器文档,以了解是否可以针对字符串类型的待测参数传入一个正则表达式。不幸的是,不支持这个功能。同时,GitHub上有一个问题请求实现这个功能。

我深入研究了代码库,看到可能可以在现有的匹配器中实现此功能。但我认为最好作为单独的匹配器来实现,从而单独捕获抽象。

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

6个回答

96
经过一番搜索,我发现 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/);

相当简单。


42

从Jasmine 2.2开始,您可以使用jasmine.stringMatching进行字符串匹配:

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

2
如果您正在使用最新版本的Jasmine,则应该接受此解决方案。当我尝试使用.argsForCall.args时,我收到了错误提示。 - dzylich
7
因此,我的默认答案视图是“活跃”而不是“投票”。 - Paul Oliver

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文档已经迁移。


13

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

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),它仍然是一个数组。 - Dr1Ku
如果你正在尝试在Angular(2+)中实现这个,TypeScript似乎不喜欢它,所以你可能需要使用方括号表示法obj.method ['calls'] ['argsFor'](index)来绕过类型检查。 - Crhistian Ramirez

8
有时候这样写更易读:
spyOn(obj, 'method').and.callFake(function(arg1, arg2) {
    expect(arg1).toMatch(/bar/);
    expect(arg2).toMatch(/baz/);
});
obj.method('bar', 'baz');
expect(obj.method).toHaveBeenCalled();

它可以更清晰地显示方法的参数(而不是使用数组)


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接