web-dev-qa-db-fra.com

Jasmine attend la logique (attendez A OR B)

Je dois définir le test pour réussir si l'une des deux attentes est satisfaite:

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number));
expect(mySpy.mostRecentCall.args[0]).toEqual(false);

Je m'attendais à ce que cela ressemble à ceci:

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number)).or.toEqual(false);

Y a-t-il quelque chose que j'ai manqué dans la documentation ou dois-je écrire mon propre matcher?

38
naugtur

Remarque: Cette solution contient la syntaxe des versions antérieures à Jasmine v2.0. Pour plus d'informations sur les matchers personnalisés maintenant, voir: https://jasmine.github.io/2.0/custom_matcher.html


Matchers.js ne fonctionne qu'avec un seul "modificateur de résultat" - not:

core/Spec.js:

jasmine.Spec.prototype.expect = function(actual) {
  var positive = new (this.getMatchersClass_())(this.env, actual, this);
  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
  return positive;

core/Matchers.js:

jasmine.Matchers = function(env, actual, spec, opt_isNot) {
  ...
  this.isNot = opt_isNot || false;
}
...
jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
  return function() {
    ...
    if (this.isNot) {
      result = !result;
    }
  }
}

Il semble donc que vous ayez vraiment besoin d'écrire votre propre matcher (à partir d'un bloc before ou it pour le bon this). Par exemple:

this.addMatchers({
   toBeAnyOf: function(expecteds) {
      var result = false;
      for (var i = 0, l = expecteds.length; i < l; i++) {
        if (this.actual === expecteds[i]) {
          result = true;
          break;
        }
      }
      return result;
   }
});
11
raina77ow

Ajoutez plusieurs chaînes comparables dans un tableau, puis comparez. Inversez l'ordre de comparaison.

expect(["New", "In Progress"]).toContain(Status);
52
Zs Felber

C'est une vieille question, mais au cas où quelqu'un chercherait encore, j'ai une autre réponse.

Que diriez-vous de construire l'expression logique OR et de simplement vous y attendre? Comme ceci:

var argIsANumber = !isNaN(mySpy.mostRecentCall.args[0]);
var argIsBooleanFalse = (mySpy.mostRecentCall.args[0] === false);

expect( argIsANumber || argIsBooleanFalse ).toBe(true);

De cette façon, vous pouvez explicitement tester/attendre la condition OR, et il vous suffit d'utiliser Jasmine pour tester une correspondance/incompatibilité booléenne. Fonctionnera dans Jasmine 1 ou Jasmine 2 :)

17
RoboBear