我已经回顾了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)
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)
有时以这种方式编写它更容易阅读:
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)
它使方法参数更清晰可见(而不是使用数组)
正如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)
| 归档时间: |
|
| 查看次数: |
34562 次 |
| 最近记录: |