2013-02-12 72 views
46

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

我已经在代码库中挖了一下,我看到如何在existing matcher中实现这个功能。我认为将它作为单独的匹配器来实现会更合适,以便抽象被单独捕获。

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

回答

68

做了一些挖掘之后,我发现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/); 

非常简单。

11

替代地,如果要在监视对象上的方法,包括:

spyOn(obj, 'method'); 
obj.method('bar', 'baz'); 
expect(obj.method.argsForCall[0][0]).toMatch(/bar/); 
expect(obj.method.argsForCall[0][1]).toMatch(/baz/); 
+5

在Jasmine 2.0中,语法是'obj.method.calls.argsFor(index)',仍然是一个数组。 – Dr1Ku 2015-09-18 11:13:19

6

如jammon提到的,茉莉2.0签名已经改变。如果您在茉莉花2.0对象的方法刺探,尼克的解决方案应改为使用类似 -

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/); 
2

有时它是更具可读性是这样写的:

spyOn(obj, 'method').and.callFake(function(arg1, arg2) { 
    expect(arg1).toMatch(/bar/); 
    expect(arg2).toMatch(/baz/); 
}); 
obj.method('bar', 'baz'); 
expect(obj.method).toHaveBeenCalled(); 

它给出的方法参数更清楚地了解(而不是使用数组)

3

茉莉2.2,你可以使用jasmine.stringMatching

var mySpy = jasmine.createSpy('foo'); 
mySpy('bar', 'baz'); 
expect(mySpy).toHaveBeenCalledWith(
    jasmine.stringMatching(/bar/), 
    jasmine.stringMatching(/baz/) 
);