web-dev-qa-db-fra.com

Est-il possible d'utiliser le matcher toHaveBeenCalledWith de Jasmine avec une expression régulière?

J'ai examiné la documentation de Jasmine sur le matcher toHaveBeenCalledWith afin de comprendre s'il est possible de passer une expression régulière pour un argument, si cet argument est censé être une chaîne. Malheureusement, cette fonctionnalité n'est pas prise en charge. Il y a aussi un problème ouvert sur github demandant cette fonctionnalité.

J'ai creusé un peu dans la base de code, et je vois comment il pourrait être possible de l'implémenter dans le matcher existant . Je pense qu'il serait plus approprié de l'implémenter en tant que matcher séparé, de sorte que l'abstraction soit capturée individuellement.

En attendant, quelle pourrait être une bonne solution de contournement?

57
zealoushacker

Après avoir creusé, j'ai découvert que les objets espion Jasmine ont une propriété calls, qui à son tour a une fonction mostRecent () . Cette fonction possède également une propriété enfant args, qui renvoie un tableau d'arguments d'appel.

Ainsi, on peut utiliser la séquence suivante pour effectuer une correspondance d'expression régulière sur les arguments d'appel, lorsque l'on veut vérifier que les arguments de chaîne correspondent à une expression régulière spécifique:

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

Assez simple.

82
zealoushacker

Dans Jasmine 2.0, le la signature a changé un pe . Le voici:

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

Et le Documentation pour Jasmine 1. a déménagé.

23
jammon

Depuis Jasmine 2.2, vous pouvez utiliser jasmine.stringMatching :

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

Alternativement, si vous espionnez une méthode sur un objet:

spyOn(obj, 'method');
obj.method('bar', 'baz');
expect(obj.method.argsForCall[0][0]).toMatch(/bar/);
expect(obj.method.argsForCall[0][1]).toMatch(/baz/);
12
Nick H247

Parfois, il est plus lisible de l'écrire de cette façon:

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

Il donne une visibilité plus claire des arguments de méthode (au lieu d'utiliser un tableau)

7
Maciej Dzikowicki

Comme jammon l'a mentionné, la signature Jasmine 2.0 a changé. Si vous espionnez la méthode d'un objet dans Jasmine 2.0, la solution de Nick devrait être modifiée pour utiliser quelque chose comme -

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/);
6
Blake