2016-07-26 4 views
1

Ich habe Schwierigkeiten zu verstehen, wie ich die Methoden für die Angular.js-Controller schreiben soll, damit die Komponententests durchgeführt werden können. Alle Tutorials im Internet sind einfach und zeigen nicht, wie es in den realen Anwendungen aussieht. Diese Tutorials zeigen, dass alle Methoden offen gelegt werden, indem sie an "scope" oder an "this (aka vm)" angehängt werden. Nach meinem Verständnis müssen Methoden, die nicht außerhalb des Controllers verwendet werden, nicht offen gelegt werden. Im folgenden Beispiel zeige ich nur zwei Methoden an, da sie durch Klicken auf die Schaltflächen auf der Seite ausgelöst werden. Der Rest der Methoden dient lediglich internen Zwecken. Wie kann ich die privaten Methoden im Controller testen, ohne sie zu exponieren? Muss ich alle ausstellen, um Unit-Tests durchführen zu können? Ist es eine gute Übung, alle Methoden aufzudecken? DankeKorrekte Art, Code für Angular zu schreiben, um Unit-Tests zu ermöglichen

angular.module('app.pool',[]) 
    .controller('PoolController', PoolController); 

function PoolController(PoolService) { 
    var vm = this; 

    vm.candidateName=''; 
    vm.candidatePicUrl=''; 

    vm.approveCandidate = approveCandidate; 
    vm.refuseCandidate = refuseCandidate; 

    function approveCandidate() { 
     PoolService.approveCandidate(); 
     getNextCandidate(); 
    } 

    function refuseCandidate() { 
     PoolService.refuseCandidate(); 
     getNextCandidate(); 
    } 

    function getNextCandidate() { 
     clearProfile(); 
     PoolService.getNextCandidate(). 
     success(displayUserData); 
    } 

    function displayUserData(data) { 
     vm.candidateName = getCandidateName(data); 
     vm.candidatePicUrl = getCandidateProfilePic(data); 
    } 

    function getCandidateName(data) { 
     return data.userName; 
    } 

    function getCandidateProfilePic(data) { 
     return changeUrlToBiggerPic(data.profilePicture); 
    } 

    function changeUrlToBiggerPic(url) { 
     return url.replace('s150x150', 's600x600'); 
    } 

    function clearProfile() { 
     vm.candidateName = ""; 
     vm.candidatePicUrl = ""; 
    } 

}

Antwort

1

definitiv keine gute Idee, private Methoden nur aus Gründen der Unit-Tests zu belichten.

Sie sollten testen können, was diese Methoden tun, indem Sie eine bestimmte Ausgabe erwarten.

Zum Beispiel:

  • Überprüfen Sie, ob eine Bereichsvariable mit dem erwarteten Wert eingestellt.
  • Stellen Sie sicher, dass die bereitgestellten Abhängigkeiten (spied) mit der richtigen Eingabe aufgerufen wurden.
0

Es kommt immer auf den Fall an, aber ja, es ist im Allgemeinen eine gute Idee, private Klassenmethoden verfügbar zu machen.

Private Methoden können mit _ Präfix Konvention benannt werden, um sie von öffentlichen Methoden zu unterscheiden und optional mit Object.defineProperty nicht aufzählbar gemacht werden.

JavaScript kann keine privaten Member (lokale Variablen) darstellen. Abgesehen davon, dass sie eine der fundamentalen OOP-Prinzipien und "eine gute Sache" im Allgemeinen ist, schädigt die Einkapselung die Testbarkeit in JS und bietet im Gegenzug wenig oder gar nichts.

Die Kapselung fügt der JS-Anwendung keine Sicherheit hinzu, und die Behandlung einer Einheit als Blackbox hilft nichts. Spione auf jede aufgerufene Methode zu setzen hilft dagegen.

+1

Mein persönlicher Dank geht an einen Fremden, der seine wertvollen Punkte verschont hat, um die ganze Frage mit null Kommentaren zu verwerfen. Ihr wertvolles Feedback wurde sehr geschätzt. – estus

Verwandte Themen