2013-02-12 3 views
46

Ich habe die Dokumentation von Jasmine des toHaveBeenCalledWith Matcher überprüft, um zu verstehen, ob es möglich ist, einen regulären Ausdruck für ein Argument zu übergeben, wenn dieses Argument eine Zeichenfolge erwartet. Leider ist dies nicht unterstützte Funktionalität. Es gibt auch eine issue open on github Anforderung dieser Funktionalität.Kann Jasmins toHaveBeenCalledWith-Matcher mit einem regulären Ausdruck verwendet werden?

Ich habe ein wenig in die Codebasis gegraben, und ich sehe, wie es möglich wäre, dies innerhalb der existing matcher zu implementieren. Ich denke jedoch, dass es angemessener wäre, es als einen separaten Matcher zu implementieren, so dass die Abstraktion individuell erfasst wird.

In der Zwischenzeit, was könnte ein guter Workaround sein?

Antwort

68

Nach einigen Graben habe ich festgestellt, dass Jasmine spy Objekte eine calls Eigenschaft haben, die wiederum eine mostRecent() Funktion hat. Diese Funktion verfügt auch über eine untergeordnete Eigenschaft args, die ein Array von Aufrufargumenten zurückgibt.

So kann man die folgende Sequenz verwenden, um ein regexp Spiel auf Abruf Argumente ausführen, wenn man überprüfen möchte, dass die String-Argumente einen bestimmten regulären Ausdruck:

var mySpy = jasmine.createSpy('foo'); 
mySpy("bar", "baz"); 
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/); 
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/); 

ziemlich einfach.

11

Alternativ, wenn Sie auf einem Objekt auf ein Verfahren spionieren:

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

In Jasmine 2.0 wäre die Syntax 'obj.method.calls.argsFor (index)', immer noch ein Array. – Dr1Ku

21

In Jasmin 2.0 die signature changed a bit. Hier wäre es:

var mySpy = jasmine.createSpy('foo'); 
mySpy("bar", "baz"); 
expect(mySpy.calls.mostRecent().args[0]).toMatch(/bar/); 
expect(mySpy.calls.mostRecent().args[1]).toMatch(/baz/); 

Und die Documentation for Jasmine 1.3 ist umgezogen.

6

Wie Jammon erwähnt, hat sich die Jasmine 2.0 Signatur geändert. Wenn Sie auf der Methode eines Objekts in Jasmine ausspionieren 2.0 Nicks Lösung sollte etwas zu verwenden, wie geändert werden -

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

Manchmal ist es besser lesbar es auf diese Weise zu schreiben:

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

Es geben mehr klare Sicht der Methodenargumente (anstelle von Array)

3

Ab Jasmin 2.2 können Sie verwenden jasmine.stringMatching:

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