2013-07-17 15 views
10

In Chai, können Sie Sachen wie folgt vorgehen:Wie funktionieren Assertion-Bibliotheken wie Chai, ohne einen Aufruf an eine Funktion zu erzwingen?

expect({}).to.exist; 

exist ist kein Funktionsaufruf, aber das funktioniert noch in Test-Frameworks. Das Gegenteil (expect({}).to.not.exist) führt dazu, dass Tests fehlschlagen, aber exist ist kein Funktionsaufruf.

Wie funktionieren diese Behauptungen, ohne dass ich eine Funktion aufrufen muss? Tatsächlich, wenn ich versuche, expect({}).to.exist() zu sagen, schlägt der Test fehl, weil exist keine Funktion ist.

Antwort

10

Ich fand es heraus (oder zumindest, fand ich eine Methode). Verwenden Sie JavaScript getters:

var throws = { 
    get a() { 
    throw new Error('a'); 
    }, 
    get b() { 
    throw new Error('b'); 
    }, 
    get c() { 
    throw new Error('c'); 
    } 
}; 

Wenn throws.a tun, throws.b oder throws.c, wird der entsprechende Fehler ausgelöst werden.

Von diesem Punkt ist es ziemlich einfach, die Behauptungen zu bauen, die in Chai enthalten sind.

+0

Wie erklärt sich das? Das ist ein ziemlich großer Sprung ohne zu erklären, was in der Mitte passiert. – vsync

+1

Der verlinkte Artikel hilft wirklich, Dinge zu erklären, wenn Sie mit Gettern nicht vertraut sind. Die kurze Version ist, dass Sie dank neuer (-ish) Browser-Verbesserungen eine Eigenschaft steuern können, die über die Einstellung hinausgeht (zB. 'A.b = 5'). Nun können Sie eine "Getter" -Methode für eine Eigenschaft definieren, und wenn ein Code versucht, den Wert dieser Eigenschaft zu lesen (z. B. "console.log (a.b)"), führt der Browser die definierte "Getter" -Methode aus. Diese Methode kann dann eine Logik auslösen (z. B. Chais Assertionslogik). Wenn Sie also eine 'to.exist'-Anweisung ausführen, obwohl noch kein '()' nach Ihnen * vorhanden ist, ruft * noch eine Methode auf (die Getter-Methode). – machineghost