2016-05-25 19 views
0

ViewModels in KnockoutJS kann einige öffentliche sowie einige private Methoden enthalten. öffentliche Methoden: Die, die an sich selbst angeschlossen sind. public_method und kann verwendet werden, um mit dem Klick von HTML zu binden.Jasmine: Testen von privaten Methoden in KnockoutJS

private Methoden: Die Methoden, die im View-Modell definiert sind, aber nicht an das View-Modell angehängt sind und intern nur von den öffentlichen Methoden verwendet werden können. Typischerweise mit Funktion privateMethod definiert() {...}

define(['./panel'], function (Panel) { 

    'use strict'; 

    function myPrivateMethod() {...} 

    self.myPublicMethod = function() {...} 

}); 

Während die Testfälle in Jasmin schreiben, können wir neue Instanz der Ansichtsmodell erstellen und die öffentlichen Methoden testen normalerweise. Aber wie können wir die privaten Methoden testen?

+0

Leider nein. Aufgrund des lokalen (privaten) Moduls sind Variablen in der Moduldefinitionsfunktion begrenzt. Und es gibt keinen Weg, sie zu erreichen. Sie können zusätzliche öffentliche Methoden/Variablen zum Testen bereitstellen und sie wie "_someVariable" markieren. – TSV

Antwort

0

Private Methoden sind nicht testbar. Selbst wenn Sie könnten, empfehle ich Ihnen, sie nicht direkt zu testen. Sie werden sie über die öffentliche API Ihrer Schließungen testen, und wenn Sie nicht sind, dann ist der Code sowieso tot.

Wenn Sie immer noch das Gefühl haben sollte testen diese privaten Methoden, dann ist das wahrscheinlich ein Code-Geruch. Wahrscheinlich verletzen Sie die SRP, und die privaten Methoden werden ziemlich viel komplexe Logik haben.

Versuchen Sie, diese privaten Methoden zu etwas öffentlichem zu machen: statische öffentliche Methoden, Methoden auf eine neue Klasse/Schließung/Funktion usw. Diese neue Einheit wird dann Unit-Testable sein. Die alte Einheit kann z.B. eine private Instanz der neuen Einheit. Wenn die neue Einheit ausreichend komplex ist, können Sie sogar ein Fabrikmuster verwenden.

Sie liefern jedoch eine Instanz der neuen Einheit an Ihre vorhandene Einheit. Sie können diese nun in Ihren Komponententests fälschen oder verspotten.

Hier einig Pseudo-Code in Ihrem Kontext, in dem die bestehenden Einheit einfach für einen Mitarbeiter fragt, die öffentlich die Funktionalität von myPrivateMethod aussetzt:

function Collaborator() { 
    function myPrivateMethod() {/*...*/} 
    this.reasonForExistence = myPrivateMethod; // unit testable 
} 

function Panel(collaborator) { 
    self.myPublicMethod = function() { 
     // do stuff 
     collaborator.reasonForExistence(); // relay to collaborator 
     // do more stuff 
    } 
} 

Sie können eine gefälschtes collaborator in Ihren Unit-Tests liefern, gibt es gewisse "Spy" zu überprüfen, dass myPublicMethod eigentlich der Mitarbeiter verwendet, wenn Sie das überprüfen möchten. In realen Szenarien werden Sie eine new Collaborator() als Abhängigkeit übergeben.