2012-06-26 5 views
11

Ich versuche Headless-Tests meiner Knockout Viewmodels zu machen. Ich vermeide absichtlich, mit irgendwelchen ui Konstrukten in meinem viewmodel umzugehen und die Verdrahtung zur html Seite zu verlassen.Headless knockout viewmodel testing mit mokka

Dies funktioniert gut in Jasmin, da es im Browser läuft, aber wenn ich zu mocha wechseln, ich am Ende läuft Kopf voran in die letzte Zeile auf Knockout, das ist:

}) (Fenster, Dokument, Navigator);

Ich habe bei Verwendung zombiejs sieht, die eine gute Alternative sein würden, aber ich selbst nicht eine gute Geschichte, wie man es verwenden, ohne Änderung der Knockout-Quelle sehen.

Irgendwelche Gedanken darüber, wie man das angeht?

+0

Welche Funktionen von Knockout brauchen Sie in Ihrer Ansicht Modelle?Wenn es nur die Observablen sind, dann verspotten Sie sie und ignorieren Sie den Rest des Knockouts beim Testen des VM-Teils. – Niko

+0

Das Problem ist, dass sogar mit der Debug-Version die Initialisierung der knockout.js-Skript (v2.1.0) Fehler bei einem Aufruf von navigator.userAgent. Daher kann ich nicht zu dem Punkt kommen, die Viewmodel- und Observable/Computed/Pubsub-Teile zu testen. –

+0

Ich denke Zombie wird dein bestes sein, da es das Dom simuliert. Knockout wurde als DOM-Modellbinder und nicht als generischer Modellbinder geschrieben. Vielleicht ist das Backbone eher auf Ihren Entwicklungsstil ausgerichtet. Glue.js ist auch eine schöne Event-Mappe. –

Antwort

3

Dies ist ein Thema, das derzeit ebenfalls auf meinem Radar ist. Ich werde meine Ergebnisse hier in der Hoffnung, dass sie Sie in die richtige Richtung weisen könnte.

Die wahrscheinlichste Route, die ich zuerst versuchen werde, ist PhantomJS. Es ist ein kopfloser WebKit-Browser, daher sollte er hervorragende DOM-, JSON-, HTML5- und CSS-Selektoren unterstützen (z. B. works with jQuery and qUnit).

Ich entschied mich für das, weil es von knockout.js selbst verwendet wird, die ich im knockout.js Repository entdeckt, wo es eine .travis.yml Datei und dieser Kommentar war:

enter image description here

I Ich habe keinen Beweis dafür, dass dies funktionieren wird, aber ich wurde ermutigt durch seinen Einsatz im Kern von knockout.js. Ich fand auch this runner script for knockout/phantom, die wie ein guter Startpunkt aussieht.

Ich habe auch festgestellt afewexamples mit Mokka und PhantomJS über node.js, this lib extending grunt einschließlich Mokka innen Phantom zu laufen, und this script showing how to run mocha inside PhantomJS. Dieser Teil ist zumindest sicher.

Eine andere Lösung noted in the knockoutjs archives ist knockout-node und JsDOM zu verwenden, um eine praktikable DOM, aber auf den ersten Blick zu schaffen, das schien zu nebulös und wahrscheinlich bei der Umsetzung Ihrer eigenen Testumgebung führen.

Es gibt eine slidedeck suggesting zombie.js würde mit Knockout/Node/etc arbeiten. Aber ich kann nichts finden, was harte Beweise bietet, also mochte ich diesen Weg auch nicht.

+0

Ich habe das mit PhantomJS gemacht und es funktioniert für mich. YMMV. –

+1

@JohnRayner Würden Sie eine Beschreibung Ihres Workflows posten? –

0

Vielleicht ist dies, weil Knockout geändert hat (wie die akzeptierte Antwort alt ist), aber heute glaube ich nicht, dass dies (mehr) notwendig ist. Sie können ein Knockout-View-Modell einfach testen.

global.ko = require('../../Website/Scripts/knockout-3.4.0.js'); 

Danach können Sie Ihren Test wie gewohnt laufen: instanziiert Ihr Viewmodels, führen alle Operationen darauf und behaupten, alles, was ich das globale ko Variable in meinem Test tun musste, wurde eingestellt.

Ich habe a little more darüber geschrieben, aber im Grunde funktioniert das für mich:

global.ko = require('../../Website/Scripts/knockout-3.4.0.js'); 

var MyViewModel = require('../../Website/Scripts/myViewModel.js').MyViewModel; 

describe('MyViewModel', function() { 
    var viewModel; 

    beforeEach(function(){ 
     viewModel = new MyViewModel(); 
    }); 

    describe('...', function() { 
     /* And so on */ 
    }); 
}); 
Verwandte Themen