testen backbone.js Ereignisse anzeigen, die mit Jasmin
Ich versuche, umzusetzen view tests für eine Coffeescript Umsetzung der allgegenwärtigen backbone.js 'todo' Beispiel (siehe github.com/rsim/backbone_coffeescript_demo.)
Mein jasmine-tests der oben genannten demo ziemlich gut, außer für die Ereignisse anzuzeigen. Ich erwarte, dass ich bin stecken geblieben auf einer oder beiden der folgenden ich) ich verstehe nicht die Veranstaltung verbindlich in die Ansicht code, ii) ich verstehe nicht, wie man richtig eingerichtet ist die Jasmin-test der anzeigen-code Veranstaltungen.
Hier ist ein Beispiel für die 'Bearbeiten' - Ereignis...
class TodoApp.TodoView extends Backbone.View
tagName: "li"
template: TodoApp.template '#item-template'
events:
"dblclick div.todo-content" : "edit"
...
initialize: ->
_.bindAll this, 'render', 'close'
@model.bind 'change', @render
@model.bind 'destroy', => @remove()
render: ->
$(@el).html @template @model.toJSON()
@setContent()
this
edit: ->
$(@el).addClass "editing"
@input.focus()
...
...nun, hier ist ein test, ob der Fokus wurde gewonnen, bei Doppelklick:
describe "edit state", ->
li = null
beforeEach ->
setFixtures('<ul id="todo-list"></ul>')
model = new Backbone.Model id: 1, content: todoValue, done: false
view = new TodoApp.TodoView model: model, template: readFixtures("_item_template.html")
$("ul#todo-list").append(view.render().el)
li = $('ul#todo-list li:first')
target = li.find('div.todo-content')
expect(target).toExist()
target.trigger('dblclick') # here's the event!
it "input takes focus", ->
expect(li.find('.todo-input').is(':focus')).toBe(true)
Die Erwartung auf weder i) der Spion, noch ii) in den Fokus erfüllt ist.
Gibt es eine Besonderheit zu testen backbone.js Ereignis-code, über die ich sollte bewusst sein, wie Jasmin?
- Ich bin mit den gleichen Problemen. Hast du dafür eine Lösung?
- Nein habe ich nicht.
- Auch ein ähnliches problem, immer noch keine Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
du bist Bespitzelung der Ansicht
edit
Methode. dies ersetzt die Methode mit einem spy-Objekt, was bedeutet, dass die eigentliche edit-Methode nicht aufgerufen. daher sind Sie@input.focus
wird nie Feuer.da Sie den test, um tatsächlich rufen Sie das edit-Methode, die ich entfernen würde, der Spion für Sie.
Seite Hinweis: rufen Sie nicht
expect
Methoden in der beforeEach. wenn Sie wirklich brauchen, um eine Erwartung auf diesen, erstellen Sie eineit
block für Sie.Ich bin nicht gut mit coffescript, damit ich vielleicht etwas fehlen aber wo sind Sie, die Einrichtung Ihres spy?
Um test-event aufrufen müssen Sie möglicherweise die Ansicht aktualisieren, die Veranstaltungen sobald Sie festgelegt haben, bis der Spion.
Ich nicht schreiben mein test in coffeescript, aber ich hatte das gleiche problem, so dass ich hoffe, Sie verzeihen mir für die Beantwortung in javadcript. Ich landete brechen Sie Ihre Prüfung in zwei verschiedenen tests. Zuerst testete ich, ob das aufrufen der Ansicht " Bearbeiten-Funktion setzen Sie den Fokus auf das Eingabefeld. Danach habe ich getestet, ob der edit-war aufgerufen, wenn das label wurde doppelt geklickt, und die haben bisher nicht dazu gekommen, die test zu bestehen. Aber hier ist, wie ich getestet habe, wenn die edit-Funktion gearbeitet.
Etwas, die möglicherweise die Ursache der Probleme ist, dass Sie Ihr Modell Und Ihre Sicht deklariert werden innerhalb beforeEach. Deklarieren Sie in beforeEach bedeutet, Sie existieren nur innerhalb beforeEach Umfang, und nicht mehr existieren, wenn Sie den Betrieb Ihrer it.
Auch, setFixtures tun, was Sie denken es tut? Der Fokus kann nicht eingestellt werden, auf ein element, das nicht Teil der DOM-Baum, also habe ich angehängt, die den Blick el auf den Körper der jasmine spec selbst. (Ich bin mit dem html-specrunner, nicht die command line-version), macht es Teil der dom-Struktur und erlaubt es den Fokus, und auch macht, ob es den Fokus hat testbar.
Das Problem dabei ist, dass das Rückgrat.Ansicht
events
Objekt ist mit Ereignis-delegation. Für die Veranstaltungen, die in der Lage sein werden, genannt Arbeit das element ist Teil von DOM, Sie können dies tun, indem Sie etwas wie$('body').append(someView.el)
in IhrembeforeEach
. Persönlich versuche ich nicht zu testen, wenn die Wirbelsäule richtig einstellenevents
- und Trigger-Klicks manuell, ist praktischer für unit-tests zum Aufruf der callback-Handler direkt auf die Vermeidung der DOM vollständig die verlangsamen können Sie Ihre tests eine Menge.Für
:focus
ist das gleiche problem, es hat ein element in den DOM, so dass jQuery kann sagen, wenn ein element fokussiert ist. In diesem Fall ist es besser, einige den Staat als Teil der Komponente und nicht die Kontrolle für den Staat durch die Abfrage des DOM, z.B.:someView.hasFocus === true
. Alternativ können Sie Spion auf die Elementefocus
Umsetzung und überprüfen, ob es genannt wurde.