2012-11-20 5 views
6

Ich bin daran interessiert, wie global die Dateiauswahl im Browser mock out. Insbesondere bin ich am meisten daran interessiert, dies in Firefox zu tun, würde aber eine allgemeine Lösung bevorzugen.Wie verspotten Sie die Dateiauswahl im Browser für Komponententests?

Ich möchte nur verhindern, dass der Dateiauswahldialog erscheint. Ich muss nicht behaupten können, dass es geöffnet hat. Das Problem ist, dass ich Komponententests für JavaScript-Code habe, die die Dateiauswahl öffnen. Wenn das Dialogfeld geöffnet wird, stoppt es die Ausführung der Testsuite.

Eine Beispielsituation ist, dass ich die onRender Methode von Backbone.View teste. Diese Methode rendert eine Unteransicht, die die Dateiauswahl beim Rendern öffnet. Da ich diese Unteransicht nicht direkt teste, würde ich es vorziehen, Teile ihres Verhaltens nicht zu verspotten, wenn ich nur daran interessiert bin, einen anderen Teil der onRender-Methode zu testen.

Beispiel:

//Test file 
it("should do something", function() { 
    var view = new App.Views.SomeView(); 
    spyOn(view.modelBinder, "bind"); 
    view.render(); 
    expect(view.modelBinder.bind).toHaveBeenCalled(); 
}); 

//View file 
onRender : function() { 
    this.modelBinder.bind(this.el, this.model); 
    this.$("#thing").html(this.subview.render().el); //This line has a side effect that opens file picker 
} 

Im Grunde will ich nicht explizit auf das Verhalten verspotten, dass die Dateiauswahl geöffnet werden verursacht, weil es nicht das, was interessiert Ich bin hier bei der Prüfung. Dadurch wird die Testsuite viel brüchiger und schwieriger zu warten.

+0

Verwenden Sie js-Test-Treiber? – leeand00

+0

Tun Sie mir einen Gefallen und fügen Sie den Einheitentest hinzu und kommentieren Sie die Zeile, in der die Funktion aufgerufen wird, die sie anzeigt. – leeand00

+0

Hinzugefügt Code und Erklärung der Situation. –

Antwort

0

Verwenden Sie sinon, um die Anrufe zu verspotten/auszuspähen. Sie können die eingehenden Anrufe testen, anstatt die Anrufe tatsächlich zu tätigen.

Auf diese Weise können Sie testen, dass die Funktion aufgerufen wurde, ohne die eigentliche Funktion aufzurufen, die den Dialog anzeigt.

+0

Ich würde es vorziehen, dies nicht zu tun, da es in der Suite variiert, was den Dateiwähler öffnet. Ich wäre eher in der Lage, den Öffner global zu verhindern. –

+0

Oben wurden einige Erklärungen dazu hinzugefügt, warum ich die spezifischen Methoden/Ereignisse, die zum Öffnen der Dateiauswahl führen, nicht ausschließen möchte. –

+0

@AndrewHubbs Wenn Ihre Komponententests von einer anderen API als der von Ihnen geschriebenen API abhängig sind, führen Sie Unit-Testing falsch durch, dann wird es zu Integrationstests anstelle von Komponententests. – leeand00

0

Um Ihre Frage zu beantworten: Tun Sie einfach nicht.

Ich würde subview.render() durch eine leere Funktion ersetzen, um den unerwünschten Nebeneffekt zu vermeiden. Sie sagen aber:

„Ich will nicht explizit aus dem Verhalten verspotten, dass die Dateiauswahl geöffnet werden verursacht, weil es ist nicht das, was ich bin interessiert in Test ...“

Das ist ein wenig widersprüchlich. Wenn Sie Unit-Test App.Views.SomeView möchten, müssen Sie externe Mitarbeiter, speziell zu verspotten, wenn nicht interessant, und einschließlich Ihrer Dateiauswahl. Auf der anderen Seite, sollten Sie nicht mit der SUT beim Unit-Testing zu tun.

Mocking in der Tat würde Ihren Test mehr anfällig für rot, macht aber ist der einzige Weg, um Ihren Produktionscode von kranken Formen der Kupplung (IMHO einer gemeinsamen pitfall mit Backbone.js apps nicht leiden, um sicherzustellen.)

Der einzige Ort, an dem Sie den Datei-Picker nicht anzeigen müssen, ist, wenn Sie den Datei-Picker selbst testen. In diesem Fall können Sie sinon als überlasteten verwenden oder ihn ohne Coverage lassen jQuery verwenden. Denken Sie daran, die "Nie einen Typ, den Sie nicht besitzen" Regel.

Verwandte Themen