2016-03-24 15 views
1

Ich habe die folgenden Winkel Service und Mock/Test-Setup. Ich kann die Schein-http-Anfrage nicht korrekt ausführen. Ich gebe ein Versprechen von meiner Fabrik zurück und lasse die HTTP-Anfrage verspottet werden, aber die Daten im Bereich der Steuerung sind nicht die Daten, die von dem http-Service zurückgegeben werden, den die Fabrik aufruft. Wie Sie sehen können, habe ich $digest() auf $rootScope und $httpBackend aufgerufen. Ich bin ratlos.Jasmine Mock für Winkel Service mit Versprechen

Sie können von der Geige sehen, dass der Code richtig funktioniert und den Text vom Dienst anzeigt, aber der Schein funktioniert nicht.

Warum?

Die Geige ist hier: https://jsfiddle.net/mbaranski/gnxxbgy3/ Hier ist der Code:

var myApp = angular.module('myApp', []); 
var ep = '/echo/json/'; 
myApp.factory('dataFactory', function($http) { 
    var getData = function() { 
    var data = $.param({ 
     json: JSON.stringify({ 
     name: "Name from Echo Service" 
     }) 
    }); 
    return $http.post(ep, data); 
    } 

    return { 
    getData: getData 
    } 
}); 

myApp.controller('MyCtrl', function($scope, dataFactory) { 
    $scope.name = 'Original Name'; 
    dataFactory.getData().then(function(data) { 
    $scope.name = data.data.name; 
    }); 
}); 

describe('Test For Site', function() { 
    beforeEach(angular.mock.module('myApp')); 
    var $controller; 
    var $httpBackend; 
    var $q; 
    var $rootScope; 
    beforeEach(angular.mock.inject(function(_$controller_, _$httpBackend_, _$q_, _$rootScope_) { 
    $controller = _$controller_; 
    $httpBackend = _$httpBackend_; 
    $q = _$q_; 
    $rootScope = _$rootScope_; 
    })); 

    describe('test pageController', function() { 
    it('Should pass', function() { 
     var scope = {}; 
     $httpBackend.expect('POST', ep); 
     $httpBackend.whenPOST(ep, function(str) { 
     return true; 
     }).respond(
     function() { 
      return { 
      name: "Name from Echo Service" 
      }; 
     }); 
     var controller = $controller('MyCtrl', { 
     $scope: scope, 
     }); 
     $httpBackend.flush(); 
     $rootScope.$digest(); 
     $rootScope.$flush(); 

     expect(scope.name).toBe('Name from Echo Service'); 
    }); 
    }); 
}); 

Hier ist der HTML

<div ng-controller="MyCtrl"> 
    Hello, {{name}}! 
</div> 
<br/> 

Antwort

1

Ich war wirklich Minute ein Problem, das viele haben es zu finden. .whenPOST von $httpBackend sollte nur object/string & zurückgeben, die eine Funktion zurückgegeben haben, die von .respond von ..whenPOST Methode zurückgegeben wurde.

Nur durch die Rückgabe von Plain JSON, anstatt function zurückzukehren, löste das Problem.

-Code

$httpBackend.whenPOST(ep, function(str) { 
    return true; 
}).respond({ 
    name: "Name from Echo Service" 
}); 

Auch $rootScope.$flush(); diese Zeile entfernen. $rootScope hat keine $flush Methode darin.

Forked JSFiddle

Verwandte Themen