我刚刚阅读了很多关于模拟$ http的文章,但我的代码出了问题。我仍然有错误:没有待处理的待处理请求!
我对来自controllers.js的方法看起来与此类似(browserDebugMode,webRoot,commentsAction是全局变量 - 它不是想让它成为全局变量:D)
$scope.getComments = function(){
if (browserDebugMode) {
$http({
method : "GET",
url : webRoot+commentsAction,
params : {action: "list"},
})
.success(function(data, status) {
//...
})
.error(function(data, status) {
//...
});
}
}
现在测试一下:
var browserDebugMode = true;
var webRoot = "http://localhost/name";
var commentsAction = '/commentsMobile.php';
describe('myApp', function() {
var scope,
httpBackend,
http,
controller;
beforeEach(angular.mock.module('myApp'));
describe('NewsDetailCtrl', function() {
beforeEach(inject(function ($rootScope, $controller, $httpBackend, $http) {
scope = $rootScope.$new();
httpBackend = $httpBackend;
http = $http;
httpBackend.when("GET", webRoot+commentsAction).respond([{}]);
controller = $controller('NewsDetailCtrl', {
'$scope': scope, 'GlobalService': globalService, $http: $http
});
}));
it('checks if AJAX is done', function () {
httpBackend.expectGET(webRoot+commentsAction).respond([{}]);
scope.getComments()
httpBackend.flush();
});
});
});
请不要问PHP脚本:)我被迫去做。
我只是想检查一下我是否可以测试$ http,仅此而已。我不知道自己做错了什么。我测试了那个控制器中的其他东西,没关系,我看看是否用console.log触发了getComments()并且它被解雇了。配置它必定有问题。
答案 0 :(得分:1)
您正在测试的代码和单元测试在不同的上下文中执行,因此它们将具有不同的全局对象,因此测试中存在的browserDebugMode
与实际代码中的$window
不同。
控制器应该注入window
(Angular的browserDebugMode
对象周围的包装器),然后检查它的if ($window.browserDebugMode) {
// actual code
}
属性:
$window
测试还应注入browserDebugMode
,然后设置该属性的beforeEach(inject(function ($window) {
$window.browserDebugMode = true;
}));
属性:
if
现在,控制器和测试都将引用相同的全局对象,$http
条件应该为true,并且{{1}}调用应该执行。