2012-11-23 6 views
25

Ich brauche den Test auf Erfolg haben, wenn einer der beiden Erwartungen erfüllt ist:Jasmine erwarten Logik (erwarten A oder B)

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

ich es erwartet wie folgt aussehen:

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

Gibt es etwas, was ich in der Dokumentation verpasst habe oder muss ich meinen eigenen Matcher schreiben?

+0

Ich überprüfte die Dokumentation und ich versuchte ein wenig Code, aber ich denke, wir können das nicht "einfach" leid tun. Aber nach dem was ich gefunden habe, kannst du deinen eigenen "kettenfähigen" Matcher erstellen. – Magus

Antwort

10

Hinweis: Diese Lösung enthält Syntax für Versionen vor Jasmine v2.0. jetzt Weitere Informationen zu benutzerdefinierten Matcher finden Sie unter: https://jasmine.github.io/2.0/custom_matcher.html


Matchers.js arbeitet mit einem einzigen 'Ergebnis Modifikator' nur - not:

Kern/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; 

Kern/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; 
    } 
    } 
} 

So sieht es aus, als müssten Sie in der Tat Ihren eigenen Matcher schreiben (aus einem before oder it Block für korrekte this). Zum Beispiel:

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; 
    } 
}); 
+1

Alles, was ich brauchte, war "es gibt keine Multi-Matches", diese Antwort ist so viel mehr! :) Danke für den Code. Ich denke nicht, dass es den 'Jasmine.any (Number)' Fall behandelt, aber ich kann es ausarbeiten. Ich werde es in Ihre Antwort einfügen, sobald Sie herausgefunden haben, ob es Ihnen nichts ausmacht. – naugtur

10

Dies ist eine alte Frage, aber falls jemand noch sucht, habe ich eine andere Antwort.

Wie wäre es, den logischen OR-Ausdruck aufzubauen und nur das zu erwarten? Wie folgt aus:

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

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

Auf diese Weise können Sie explizit testen/erwarten, dass die OR-Bedingung, und Sie müssen nur Jasmin verwenden, um eine Boolesche Übereinstimmung/Nichtübereinstimmung zu testen. Arbeitet in Jasmine 1 oder Jasmine 2 :)

18

Fügen Sie mehrere vergleichbare Strings in ein Array und vergleichen Sie dann. Kehren Sie die Reihenfolge des Vergleichs um.

expect(["New", "In Progress"]).toContain(Status); 
+0

Großartige Idee, sehr prägnant! Und gibt deutlichere Fehlermeldungen als 'expect (Status ==" New "|| Status ==" In Progress "). ToBe (true);' –