Erstellen von benutzerdefiniertem Material für Komponententests in Jasmine 2.0

Vor kurzem hatte ich das Bedürfnis, einen benutzerdefinierten Matchmaker in Jasmin zu schreiben. Als erstes fing ich an zu googeln und fand ein Beispiel, in dem alles klar und deutlich erklärt ist. Eigentlich ist der Code unten dargestellt:

describe('Hello world', function () {
    beforeEach(function() {
        this.addMatchers({
            toBeWithinOf: function(distance, base) {
                this.message = function() {
                    var lower = base - distance,
                           upper = base + distance;
                    return "Expected " + this.actual + " to be between " +
                        lower + " and " + upper + " (inclusive)";
                };
                return Math.abs(this.actual - base) <= distance;
            }
        });
    });
    it('should be within in range', function () {
        expect(8).toBeWithinOf(2, 6);
    });
});


In diesem Beispiel wird ein Matcher erstellt, der angibt , ob die eingegebene Nummer ( this.actual ) in einem bestimmten Intervall liegt. Beachten Sie, dass beim Aufruf des Matches zwei Parameter übergeben werden: base - die Zahl, von der aus auf beiden Seiten gemessen wird, ein bestimmter Wert - der Abstand , der schließlich das Suchintervall bildet - [base - distance, base + distance] . In diesem Fall erwarten wir 8 im Intervall [4, 8]. Wenn die vom Benutzer angegebene Zahl außerhalb des Intervalls liegt, wird in den Tests der Fehler angezeigt , den wir mit der Funktion this.message generieren .

Alles scheint nichts zu sein, aber beim Ausführen des Beispiels in Jasmin 2.0 funktioniert nichts davon. Es stellt sich heraus, dass sich die Syntax etwas geändert hat.

Ich habe eine Reihe von Möglichkeiten ausprobiert und konnte dieses Problem lösen, nachdem ich mehr als ein Forum geklettert hatte. Der Lösungscode lautet wie folgt:

describe('Hello world', function () {
    beforeEach(function () {
        jasmine.addMatchers({
            toBeWithinOf: function () {
                return {
                    compare: function (actual, distance, base) {
                        var lower = base - distance,
                            upper = base + distance,
                            result = {
                                pass:  Math.abs(actual - base) <= distance
                            };
                        if(!result.pass) {
                            result.message =  "Expected " + actual + " to be between " +
                            lower + " and " + upper + " (inclusive)";
                        }
                        return result;
                    }
                }
            }
        })
    });
    it('should be within in range', function () {
        expect(8).toBeWithinOf(2, 6);
    });
});

Wie Sie sehen, wurde die Methode zum Aufrufen der Funktion zum Hinzufügen von Matchern geändert ( this.addMatchers -> jasmine.addMatchers ). Außerdem müssen wir von der Funktion selbst ein Objekt zurückgeben, in dem die compare- Methode deklariert werden soll , die alle Parameter und nicht die match-Funktion selbst übernimmt.

Bitte beachten Sie, dass der erste ( aktuelle ) Parameter der Nummer entspricht, die wir überprüfen möchten. Wenn wir unsere Parameter (wie in unserem Fall, Basis und Entfernung) auf den Player selbst übertragen müssen, können Sie sie dort angeben.

Innerhalb der Vergleichsfunktion selbst erstellen wir ein Objekt, in das wir sofort die Vergleichseigenschaft ( pass ) schreiben . Und nur wenn diese Eigenschaft am Ende nicht funktioniert, wird die Eigenschaft erst dann erstelltMeldung , in der Sie den Text eingeben können, der dem Benutzer angezeigt wird, wenn der Test fehlschlägt.

Einen Link zu einem Arbeitsbeispiel finden Sie hier - Geige .

Das ist alles

Jetzt auch beliebt: