是否有可能使用Jasmine的toHaveBeenCalledWith matcher和正则表达式?

时间:2013-02-12 20:22:16

标签: jasmine

我已经回顾了Jasmine的toHaveBeenCalledWith匹配器的文档,以便了解是否可以为参数传递正则表达式,如果该参数应该是一个字符串。不幸的是,这是不受支持的功能。还有issue open on github请求此功能。

我已经挖了一些代码库,我看到如何在existing matcher内实现它。我认为将它作为一个单独的匹配器实现更合适,这样就可以单独捕获抽象。

与此同时,什么可能是一个好的解决方法?

6 个答案:

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

Documentation for Jasmine 1.3已经移动。

答案 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();

它提供了更清晰的方法参数可见性(而不是使用数组)