2012-11-23 11 views
25

ho bisogno di impostare il test di successo se uno dei due aspettative è soddisfatta:Jasmine si aspettano logica (si aspettano A o B)

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

mi aspettavo di simile a questa:

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

C'è qualcosa che mi è mancato nei documenti o devo scrivere il mio matcher?

+0

Ho controllato la documentazione e ho provato un po 'di codice, ma penso che non possiamo farlo "facilmente" mi dispiace. Ma in base a quello che ho trovato, puoi creare il tuo matcher "concatenabile". – Magus

risposta

10

Nota: questa soluzione contiene la sintassi per le versioni precedenti a Jasmine v2.0. Per ulteriori informazioni su matchers personalizzati ora, si veda: https://jasmine.github.io/2.0/custom_matcher.html


Matchers.js lavora con un unico 'modificatore di risultato e' solo - 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; 
    } 
    } 
} 

Quindi sembra che tu abbia davvero bisogno di scrivere il tuo corrispondente (da un blocco before o it per il corretto this). Ad esempio:

+1

Tutto ciò di cui avevo bisogno era "non ci sono più abbinamenti", questa risposta è molto di più! :) Grazie per il codice. Non penso che gestisca il caso 'jasmine.any (Number)', ma posso risolverlo. Lo inserirò nella tua risposta una volta capito se non ti dispiace. – naugtur

10

Questa è una vecchia domanda, ma nel caso qualcuno stia ancora guardando ho un'altra risposta.

Che ne dici di creare l'espressione logica OR e aspettarselo? Come questo:

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

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

In questo modo, è possibile testare in modo esplicito/aspettarsi la condizione OR, e solo bisogno di utilizzare Jasmine per verificare un valore booleano partita/mancata corrispondenza. Funzionerà in Jasmine 1 o Jasmine 2 :)

18

Aggiungere più stringhe confrontabili in un array e quindi confrontare. Invertire l'ordine di paragone.

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

Ottima idea, molto succinta! E fornisce messaggi di errore molto più chiari di "expect (Status ==" New "|| Status ==" In Progress "). ToBe (true);' –

Problemi correlati