我刚刚读了很多关于嘲笑$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调用应该执行。

07-24 17:38