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
});
}