茉莉角 - 嘲笑http请求

时间:2014-12-17 22:51:06

标签: javascript angularjs unit-testing http jasmine

我刚刚阅读了很多关于模拟$ 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()并且它被解雇了。配置它必定有问题。

1 个答案:

答案 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}}调用应该执行。