testing backbone.js Ereignisse mit Jasmin anzeigen

8

Ich versuche, View-Tests für eine Coffeescript-Implementierung des allgegenwärtigen backbone.js 'todo' Beispiels zu implementieren (siehe github.com/rsim/backbone_coffeescript_demo.)

Meine Jasmin-Tests der obigen Demo funktionieren ziemlich gut, abgesehen von View-Events. Ich erwarte, dass ich auf einem oder beiden der folgenden Punkte feststecke: i) Ich verstehe die Ereignisbindung im Ansichtscode nicht. Ii) Ich verstehe nicht, wie ich den Jasmine-Test der Ansichtscodeereignisse richtig einrichten soll.

Hier ist ein Beispiel für das Ereignis 'edit' ...

%Vor%

... hier ist ein Test, ob der Fokus beim Doppelklick erreicht wurde:

%Vor%

Die Erwartung weder an den Spion noch an den Fokus ist erfüllt.

Gibt es eine Besonderheit beim Testen von backbone.js Ereigniscode, über den ich in Jasmine Bescheid wissen sollte?

    
Lille 28.09.2011, 23:14
quelle

4 Antworten

2

Sie spionieren die Methode edit der Ansicht aus. Dies ersetzt die Methode durch ein Spy-Objekt, was bedeutet, dass die tatsächliche Editiermethode nicht aufgerufen wird. Daher wirst du @input.focus niemals feuern.

Da Sie wollen, dass der Test tatsächlich Ihre Editiermethode aufruft, würde ich den Spion dafür entfernen.

Seitennotiz: Rufen Sie nicht expect Methoden in Ihrem beforeEach auf. Wenn Sie wirklich eine Erwartung auf diese setzen müssen, erstellen Sie einen it -Block für sie.

    
Derick Bailey 29.09.2011 01:35
quelle
2

Ich bin nicht großartig mit coffescript, also könnte ich etwas vermissen, aber wo richten Sie Ihren Spion ein?

Um Ereignisaufrufe zu testen, müssen Sie möglicherweise die Ereignisse der Ansicht aktualisieren, sobald Sie den Spion eingerichtet haben.

%Vor%     
daddywoodland 21.09.2012 12:03
quelle
0

Ich habe meinen Test nicht in coffeescript geschrieben, aber ich hatte das gleiche Problem, also hoffe ich, dass Sie mir vergeben werden, wenn ich in Javadcript antworte. Ich habe deinen Test in zwei verschiedene Tests aufgeteilt. Zuerst habe ich getestet, ob der Aufruf der Bearbeitungsfunktion der Ansicht den Fokus auf das Eingabefeld setzt. Danach testete ich, ob die Bearbeitung aufgerufen wurde, als das Label doppelt angeklickt wurde, und habe diesen Test noch nicht bestanden. Aber hier habe ich getestet, ob die Bearbeitungsfunktion funktioniert hat.

%Vor%

Etwas, das Probleme verursachen könnte, ist, dass Ihr Modell und Ihre Ansicht innerhalb von beforeEach deklariert sind. Deklaration von drinnen vorherEs bedeutet, dass sie nur innerhalb des Gültigkeitsbereichs von exach existieren und nicht mehr existieren, wenn Sie sie ausführen.

Auch, tun setFixtures tun, was Sie denken, dass es tut? Der Fokus kann nicht auf ein Element gesetzt werden, das nicht Teil des DOM-Baums ist, also habe ich das el der Ansicht an den Körper der Jasmin-Spezifikation selbst angehängt. (Ich benutze den html specrunner, nicht die Kommandozeilenversion) Das macht es zu einem Teil des Dom-Baumes und erlaubt es daher, den Fokus zu haben, und macht auch, ob es Fokus-testbar ist.

    
Tara Roys 19.02.2013 02:13
quelle
0

Das Problem dabei ist, dass das Objekt Backbone.View events die Ereignisdelegierung verwendet. Damit die Ereignisse als Arbeit bezeichnet werden können, muss das Element Teil von DOM sein. Dies können Sie tun, indem Sie in $('body').append(someView.el) etwas wie beforeEach tun. Persönlich versuche ich nicht zu testen, ob Backbone das events richtig einstellt und Klicks manuell auslöst. Praktischer ist es, wenn Komponententests die Callback-Handler direkt aufrufen, wodurch das DOM komplett vermieden wird, was Ihre Tests stark verlangsamen kann.

Für :focus ist das gleiche Problem, es muss ein Element im DOM vorhanden sein, damit jQuery erkennen kann, ob ein Element fokussiert ist. In diesem Fall ist es besser, einen Zustand als Teil Ihrer Komponente festzulegen und den Zustand nicht über die Abfrage des DOM zu prüfen, z. B .: someView.hasFocus === true . Alternativ können Sie die Elemente focus implementation ausspionieren und prüfen, ob sie aufgerufen wurde.

    
Mario Estrada 23.06.2015 00:46
quelle