是否有可能使用Jasmine的hasBeenCalledWith具有正则expression式的匹配器?
我已经检查了Jasper的toHaveBeenCalledWith匹配器的文档,以了解是否有可能为parameter passing一个正则expression式,如果该参数预期是一个string的话。 不幸的是,这是不受支持的function。 github上还有一个问题需要这个function。
我已经挖掘了一些代码库,并且看到如何在现有的匹配器中实现这个function。 我认为将它作为一个单独的匹配器来实现会更合适,因此抽象是单独捕获的。
与此同时,什么可能是一个很好的解决方法?
在做了一些挖掘之后,我发现Jasmine间谍对象有一个calls
属性,而这个属性又有一个mostRecent()函数。 这个函数也有一个子属性args
,它返回一个调用参数数组。
因此,当需要检查string参数是否与特定正则expression式匹配时,可以使用以下顺序对调用参数执行正则expression式匹配:
var mySpy = jasmine.createSpy('foo'); mySpy("bar", "baz"); expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/); expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/);
非常简单
在茉莉花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/);
而茉莉花1.3的文档已经移动。
或者,如果您正在监视某个对象的方法:
spyOn(obj, 'method'); obj.method('bar', 'baz'); expect(obj.method.argsForCall[0][0]).toMatch(/bar/); expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
正如jammon提到的,Jasmine 2.0签名已经改变了。 如果你正在窥探Jasmine 2.0中的一个对象的方法,尼克的解决scheme应该改为使用类似于 –
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/);
从Jasmine 2.2开始,你可以使用jasmine.stringMatching
:
var mySpy = jasmine.createSpy('foo'); mySpy('bar', 'baz'); expect(mySpy).toHaveBeenCalledWith( jasmine.stringMatching(/bar/), jasmine.stringMatching(/baz/) );
有时候用这种方法写下来更具有可读性:
spyOn(obj, 'method').and.callFake(function(arg1, arg2) { expect(arg1).toMatch(/bar/); expect(arg2).toMatch(/baz/); }); obj.method('bar', 'baz'); expect(obj.method).toHaveBeenCalled();
它给方法参数更清晰的可见性(而不是使用数组)