75

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

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

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

4

6 回答 6

92

经过一番挖掘,我发现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/);

很简单。

于 2013-02-12T20:22:15.880 回答
40

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

var mySpy = jasmine.createSpy('foo');
mySpy('bar', 'baz');
expect(mySpy).toHaveBeenCalledWith(
  jasmine.stringMatching(/bar/),
  jasmine.stringMatching(/baz/)
);
于 2017-03-21T02:28:25.043 回答
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的文档已经移动。

于 2014-06-08T05:02:28.230 回答
13

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

spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
于 2014-02-19T07:30:32.097 回答
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();

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

于 2015-09-23T10:42:15.910 回答
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/);
于 2014-09-24T20:38:58.600 回答