我正在尝试为角度控制器创建一个非常简单的单元测试但是我发现了很多关于模拟服务的不同信息,给出了不同的方法,其中大多数示例围绕依赖为$ http。
我有一个非常基本的服务来管理我的应用程序中的“错误”,它本质上提供了一个用于本地存储管理的基本API。
我的控制器如下:
控制器:
var app = angular.module('bugTrackerApp.controllers', []);
app.controller('App', ['$scope', 'bugsAPI', function ($scope, bugsAPI) {
$scope.addBug = function()
{
bugsAPI.addBug($scope.bug);
$scope.setEmptyBug();
}
$scope.setEmptyBug = function(){
$scope.bug = {};
$scope.bug.status = 1;
$scope.bug.assignee = null;
$scope.bug.dateAdded = new Date();
}
$scope.setEmptyBug();
}]);
我创建的测试看起来像:
describe('Controllers', function(){
var scope, controller, mockBugsAPI;
beforeEach(module('bugTrackerApp.controllers', function($provide){
mockBugsAPI = jasmine.createSpyObj('bugsAPI', ['addBug']);
$provide.value('bugsAPI', mockBugsAPI);
}));
describe('App Controller', function () {
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
controller = $controller('App', {
'$scope': scope
});
}));
it('should be defined....', function() {
expect(controller).toBeDefined();
});
it('should define a bug....', function() {
expect(scope.bug).toBeDefined();
});
it('should set defaults on the initialised bug....', function() {
expect(scope.bug.status).toBe(1);
expect(scope.bug.assignee).toBe(null);
expect(scope.bug.dateAdded instanceof Date).toBe(true);
});
it('should be able to add a bug....', function() {
scope.addBug(scope.bug);
expect(mockBugsAPI.addBug).toHaveBeenCalled();
});
});
});
这是一个好方法吗?我创建了服务的间谍对象,然后使用$ provide来确保注入此间谍对象而不是实际服务。