Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jasmine:使用$http测试调用服务的控制器函数_Javascript_Angularjs_Unit Testing_Testing_Jasmine - Fatal编程技术网

Javascript Jasmine:使用$http测试调用服务的控制器函数

Javascript Jasmine:使用$http测试调用服务的控制器函数,javascript,angularjs,unit-testing,testing,jasmine,Javascript,Angularjs,Unit Testing,Testing,Jasmine,我正在尝试测试使用服务的控制器。但是,服务当前为空,因为我想隔离控制器中的测试 这是当前的测试,它不起作用,因为BoardService为null beforeEach(inject(function($rootScope, $controller) { scope = $rootScope.$new(); BoardController = $controller('BoardController', { $scope: scope, bo

我正在尝试测试使用
服务的
控制器
。但是,
服务
当前为
,因为我想隔离
控制器
中的测试

这是当前的测试,它不起作用,因为
BoardService
null

beforeEach(inject(function($rootScope, $controller) {

    scope = $rootScope.$new();

    BoardController = $controller('BoardController', { 
        $scope: scope,
        board: {id: 1, tasks: {}},
        BoardService: null
    });

}));


it ("should add a new task", function() {

    var tasksBefore = scope.board.tasks.length;

    scope.addTask(category, 'this is a new task');

    var tasksAfter = scope.board.tasks.length;

    expect(tasksAfter).toBe(tasksBefore + 1);
});
以下是来自控制器的
addTask()
函数:

$scope.addTask = function(category, task) {

    BoardService.addTask({name : task, category : category.id}).success(function(task_id) {
        // Removed code for simplicity
    });

}
aa最后,
服务中的函数

this.addTask = function(data) {
    return $http.post($rootScope.serverRoot + '/task/create', data);            
}

我认为这个想法是要模拟一个
宽带服务
…所以可能类似于

beforeEach(inject(function($rootScope, $controller) {

    scope = $rootScope.$new();
    var boardService = {
         addTask:function(task){
            var d = $q.defer();
            d.resolve(/*Whatever your service function returns: if its just a task_id, return an int or something*/);
            return d.promise;
         };
    };

    BoardController = $controller('BoardController', { 
        $scope: scope,
        board: {id: 1, tasks: {}},
        BoardService: boardService
    });

}));


it ("should add a new task", function() {

    var tasksBefore = scope.board.tasks.length;

    scope.addTask(category, 'this is a new task');
    scope.$apply();
    var tasksAfter = scope.board.tasks.length;

    expect(tasksAfter).toBe(tasksBefore + 1);
});

首先,您需要模拟BoardService并存根您需要测试的函数

beforeEach(inject(function ($rootScope, $controller, $q) {
    fakeDashboardItemService = {
        addTask: function () {}
    };

    scope = $rootScope.$new();
    q = $q;
    BoardController = $controller('BoardController', {
        $scope: scope, 
        BoardService: fakeBoardService
    });
}));
然后,您可以
spyOn
您截取的函数,设置您的测试用例,并返回承诺。我在这里使用$digest是为了提高速度和避免弄乱根范围()

最后一个重要的变化是,您应该重新考虑控制器方法以使用
。然后
而不是
。成功。
错误
。这样,您就可以处理完整的
$http
承诺,而不仅仅是从测试函数返回承诺时不会调用的成功和错误子函数。请注意,
。然后
接收整个响应,而不仅仅是数据

$scope.addTask = function(category, task) {
    BoardService.addTask({name: task, category: category.id}).then(function(response) {
        // handle success case
        var task_id = response.data;
    }, function(err) {
        // handle error case
    });
}
$scope.addTask = function(category, task) {
    BoardService.addTask({name: task, category: category.id}).then(function(response) {
        // handle success case
        var task_id = response.data;
    }, function(err) {
        // handle error case
    });
}