您能否为以下Ctrl建议一些好的单元测试?
angular.module('app') .controller('MainCtrl', ['$scope', 'API', '$location', function ($scope, API, $location) { // redirect back to login page if( ! API.token ) $location.path('/'); }]);
答案 0 :(得分:8)
单元测试应该只关注它正在测试的组件。您不应该测试$ location实际执行的操作,而是在需要时调用该方法。此外,您并不关心API服务的作用,当令牌为虚假时,控制器会调用位置方法。
我会:
模拟服务API
。
监视$location.path
方法。
将API.token
设为true
。
检查是否未调用$location.path
。
将API.token
设为false
检查是否已使用参数“/".
调用$location.path
这样的事情:
describe('Controller: MainCtrl', function() {
// Define this test's local variables
var scope,
$location,
MainCtrl;
// Load the controller's module
beforeEach(angular.mock.module('app'));
/* jshint camelcase:false */
// Initialize the controller and scope
beforeEach(angular.mock.inject(function($controller, $rootScope, _$location_) {
scope = $rootScope.$new();
$location = _$location_;
spyOn($location, 'path');
MainCtrl = $controller('MainCtrl', {
$scope: scope,
API: {token: false},
$location: $location
});
}));
it('should exist', function() {
expect(MainCtrl).toBeTruthy();
});
describe('when created', function() {
it('should call $location accordingly', function () {
expect($location.path).toHaveBeenCalledWith('/');
});
});
});