我有以下Angular服务和模拟/测试设置。我无法让模拟http请求正常工作。我正在从工厂返回一个承诺,并且模拟了HTTP请求,但控制器范围内的数据不是工厂调用的http服务返回的数据。
如您所见,我在$digest()
和$rootScope
上致电$httpBackend
。我很茫然。
您可以从小提琴中看到代码正常工作并显示服务中的文本,但模拟无效。
为什么?
小提琴在这里:https://jsfiddle.net/mbaranski/gnxxbgy3/ 这是代码:
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');
});
});
});
这是HTML
<div ng-controller="MyCtrl">
Hello, {{name}}!
</div>
<br/>
答案 0 :(得分:1)
我真是一个小问题,需要花很多钱才能找到它。 .whenPOST
的{{1}}只应返回$httpBackend
&amp;您正在返回一个从object/string
方法.respond
返回的函数。
只需返回普通的JSON,而不是返回..whenPOST
解决问题。
<强>代码强>
function
同时删除此行$httpBackend.whenPOST(ep, function(str) {
return true;
}).respond({
name: "Name from Echo Service"
});
。 $rootScope.$flush();
中没有$rootScope
方法。