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

zea*_*ker 60 jasmine

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

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

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

zea*_*ker 85

在做了一些挖掘后,我发现Jasmine间谍对象有一个calls属性,而后者又有一个moreRecent()函数.该函数还有一个子属性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/);
Run Code Online (Sandbox Code Playgroud)

非常直截了当.


Rus*_*ord 24

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

var mySpy = jasmine.createSpy('foo');
mySpy('bar', 'baz');
expect(mySpy).toHaveBeenCalledWith(
  jasmine.stringMatching(/bar/),
  jasmine.stringMatching(/baz/)
);
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是最新的茉莉花,这应该是公认的解决方案。尝试使用.argsForCall和.args时收到错误 (2认同)
  • 这就是为什么我的默认答案视图为“有效”而不是“投票”的原因。 (2认同)

jam*_*mon 23

在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/);
Run Code Online (Sandbox Code Playgroud)

Jasmine 1.3文档已经发生了变化.


Nic*_*247 12

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

spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
Run Code Online (Sandbox Code Playgroud)

  • 在Jasmine 2.0中,语法是`obj.method.calls.argsFor(index)`,仍然是一个数组. (5认同)

Mac*_*cki 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();
Run Code Online (Sandbox Code Playgroud)

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


Bla*_*ake 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/);
Run Code Online (Sandbox Code Playgroud)