我刚刚读了很多关于嘲笑$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,仅此而已。我不知道我做错了什么。我在那个控制器中测试了其他东西,没关系,我查看了getComments()是否与console.log一起被激发,它是否被激发。配置它肯定有问题。
最佳答案
您正在测试的代码和单元测试在不同的上下文中执行,因此它们将具有不同的全局对象,因此在您的测试中存在的与您实际代码中的代码不同。
控制器应该注入browserDebugMode
(angular的包装器在$window
对象周围),然后检查该对象的window
属性:
if ($window.browserDebugMode) {
// actual code
}
测试还应注入
browserDebugMode
,然后设置其$window
属性:beforeEach(inject(function ($window) {
$window.browserDebugMode = true;
}));
现在控制器和测试都将引用同一个全局对象,
browserDebugMode
条件的值应该为true,if
调用应该执行。