2016-04-15 3 views
0

Ich habe einige Probleme herauszufinden, wie man Tests für eine Controller-Methode korrekt schreibt, die einen Angular-Dienst aufrufen und einen bestimmten Wert zurückgeben muss, aber ich muss dazu in der Lage sein Testen Sie den Code innerhalb der Funktion .then() danach. HierRückgabe von Werten aus einem mokierten eckigen Service und Aufruf durch

ist die Grundidee:

// Controller 

$scope.myMethod = function() { 
    methodName.connect().then(
     function(returnValue) { 
      if (returnValue.prop === 1) { 
       $scope.callMade = true; 
       $rootScope.$emit('callWasMade'); 
      } 
     }, 
     function() { 
      $rootScope.$emit('callWasNotMade'); 
     } 
    ); 
}; 

Deshalb möchte ich den Aufruf der Methode auf dem $ Umfang zu testen, rufen Sie die methodName.connect() Funktion, aber ich möchte eine Antwort verspotten (Überschreiben return) aber die Funktion immernoch normal laufen lassen. Etwas wie:

// Test 

describe('connecting to method', function() { 
    it('should do nothing when returnValue.prop does not equal 1', function() { 
     spyOn(methodName, 'connect').and.returnValue({ prop: 2 }); 
     scope.myMethod(); 
     expect(scope.callMade).toBeFalsy(); 
    }); 

    it('should pass when returnValue.prop does equal 1', function() { 
     spyOn(methodName, 'connect').and.returnValue({ prop: 1 }); 
     scope.myMethod(); 
     expect(scope.callMade).toBeTruthy(); 
    }); 
}); 

Außer diesem gibt

undefined is not a constructor (evaluating 'methodName.connect().then') (...) 

Wie kann ich die Ausgabe von methodName.connect auf diese Weise kontrollieren?

Danke.

+0

Weil 'methodName' ist nicht auf den Umfang angebracht sind, können Sie ein Spion wie' spyOn (methoden, 'connect') erstellen '. Ihr Problem ist, dass Ihre Codes die Bedenken nicht trennen. Es ist also schwer zu testen. – Qianyue

+0

Also sollte ich methodName an den Bereich angehängt? In diesem Beispiel soll methodName einen Service darstellen. – AMcI

Antwort

0

Wie Sie sagen, dass Methodenname ein Service ist. Spotten Sie einfach diesen Service im Controller injiziert.

Auch ich habe eine Frage für Ihren Controller. Warum ist myMethod an Scope angeschlossen, aber nicht an den Controller selbst (wie: myMethod = function() {})?

Die folgenden Codes funktionieren sollte:

describe('connecting to method', function() { 
    beforeEach(inject(function($controller, $rootScope) { 
    // create a mock service attached to controller 
    methodName = { 
     connect: function() { 
     } 
    }; 

    spyOn(methodName, 'connect').and.returnValue({ prop: 2 }); 

    scope = $rootScope.$new(); 
    controller = $controller('yourCtrl', { 
     $scope: scope, 
     methodName : methodName 
    }); 
    })); 

    it('should do nothing when returnValue.prop does not equal 1', function() { 
    // here I consider myMethod is a method of controller, but not of the scope 
    myMethod(); 
    expect(scope.callMade).toBeFalsy(); 
    }); 
}); 
+0

Hi Qianyue, ich bekomme immer noch diesen Fehler: 'TypeError: undefined ist kein Objekt (evaluiert 'myMethod.connect(). Then')'. In diesem Fall ist myMethod ein Dienst, der eine Verbindung zu einem Websocket herstellt und ein erfülltes Versprechen mit einem Objekt zurückgibt. Dann muss ich testen, ob "returnValue.prop" gleich 1 ist, um einige Bereichsvariablen festzulegen. Wenn es nicht ist, sollte es nichts tun. – AMcI

+0

@AMcI Beachten Sie, dass ich hier nur eine Vorstellung davon gebe, wie man einen Controller mit Service testet. Und meine Codes nehmen an, dass sich in Ihrem Controller myMethod unter Controller befindet, aber nicht im Bereich. Können Sie eine Datei erstellen, um Ihr Problem zu zeigen? Ich kann nicht sagen, wo das Problem liegt, weil es nicht genug Informationen für mich gibt. – Qianyue

+0

Hi Qianyue - Nach einigem Nachdenken über das Wochenende denke ich, dass ich vielleicht in die falsche Richtung gehe, wie du gesagt hast. Ich denke, ich muss die Sorgen mehr trennen. Danke für Ihre Hilfe! – AMcI

Verwandte Themen