Wie schreibe ich testbare Controller mit privaten Methoden in AngularJs?

Also gut, ich bin schon lange auf ein Problem gestoßen und würde gerne eine Meinung vom Rest der Community hören.

Schauen wir uns zunächst einen abstrakten Controller an.

function Ctrl($scope, anyService) {

   $scope.field = "field";
   $scope.whenClicked = function() {
      util();
   };

   function util() {
      anyService.doSmth();
   }

}

Klar haben wir hier:

Regelgerüst für Controller mit$scope und etwas Service eingespritztein Feld und eine Funktion, die an den Geltungsbereich angehängt sindprivate Methodeutil()

Jetzt möchte ich diese Klasse in Unit-Tests (Jasmine) behandeln. Das Problem ist jedoch, dass ich das überprüfen möchte, wenn ich auf (callwhenClicked()) einige Artikel, die dieutil() Methode wird aufgerufen. Ich weiß nicht, wie ich das machen soll, da ich bei Jasmin-Tests immer Fehler bekomme, die entweder der falsche Grund sindutil() wurde nicht definiert oder nicht aufgerufen.

Hinweis: Ich versuche nicht, dieses spezielle Beispiel zu korrigieren, sondern möchte ein solches Codemuster generell testen. Also sag mir bitte nicht "was ist ein genauer Fehler". Ich frage, wie man das macht, nicht, wie man das behebt.

Ich habe eine Reihe von Möglichkeiten ausprobiert, um dies zu umgehen:

offensichtlich kann ich nicht verwenden$scope in meinen Unit Tests, da ich diese Funktion nicht an dieses Objekt angehängt habe (endet normalerweise mit message)Expected spy but got undefined oder ähnliches)Ich habe versucht, diese Funktionen über an das Controller-Objekt anzuhängenCtrl.util = util; und dann Verifizieren von Mocks wieCtrl.util = jasmine.createSpy() aber in diesem FallCtrl.util wird nicht aufgerufen, daher schlagen die Tests fehlIch habe versucht mich zu ändernutil() angehängt werden anthis Objekt und SpottCtrl.util wieder ohne Glück

Nun, ich kann mich hier nicht zurechtfinden, ich würde Hilfe von JS-Ninjas erwarten, eine funktionierende Geige wäre perfekt.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage