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/>