Я тестирую модуль с директивой Angular и хотел бы каким-то образом высмеять или заглушить экземпляр именованного контроллера в unit test.
Итак, сначала я полагаюсь на некоторый код...
'use strict';
angular.module('App.Directives.BreadCrumbs', [])
.directive('kxBreadcrumbs', function () {
return {
restrict: 'E',
controller: 'BreadCrumbsController',
template:
'<!-- Breadcrumbs Directive HTML -->' +
'<ol class="breadcrumb">' +
' <li ng-repeat="crumb in crumbPath">' +
' <a ng-class="{true: \'disable\', false: \'\'}[crumb.last]" href="{{crumb.href}}" ng-click="updateCrumb(crumb.name)">{{crumb.name}}</a>' +
' </li>' +
'</ol>' +
'<!-- End of Breadcrumbs Driective HTML -->'
};
});
Это одна типовая директива, в которой я бы unit test, что важно убрать из нее именованный контроллер.
Итак, в моем unit test
'use strict';
describe('Directives: Breadcrumbs', function () {
var//iable declarations
elm,
scope,
$rootScope
;
beforeEach(function () {
module('App.Directives.BreadCrumbs');
module('App.Controllers.BreadCrumbs');
module('App.Constants'); // <--- Comes from the controller dependancy
});
beforeEach(inject(function (_$rootScope_, $compile) {
$rootScope = _$rootScope_;
scope = $rootScope.$new();
elm = angular.element('<kx-breadcrumbs></kx-breadcrumbs>');
$compile(elm)(scope);
scope.$apply();
}));
it('Should create the breadcrumbs template', function () {
scope.crumbPath = [{name: 'home', href: '/'},{name: 'coffee', href: '/coffee'},{name: 'milk', href: '/milk'}];
scope.$apply();
var listItem = $(elm).find('li');
expect(listItem.length).toBe(3);
expect($(listItem).text()).toContain('home');
expect($(listItem).text()).toContain('coffee');
expect($(listItem).text()).toContain('milk');
});
});
Вы можете увидеть включение трех модулей - директивы, контроллера и третьей константы. На это ссылается контроллер как зависимость, поэтому для того, чтобы вытащить это в unit test, мне нужно затянуть зависимость или в гораздо худших случаях зависимость от контроллера. Но поскольку я не тестирую функциональность контроллера в директиве unit test, это кажется избыточным и раздутым кодом посредством включения модулей. В идеале я хотел бы включить только модуль, который я тестирую на модуле.
module('App.Directives.BreadCrumbs');
и не (модули добавлены для иллюстрации моей точки больше)
module('App.Directives.BreadCrumbs');
module('App.Controllers.BreadCrumbs');
module('App.Constants'); // <--- Comes from the controller dependancy
module('App.Service.SomeService'); // <--- Comes from the controller dependancy
module('App.Service.SomeOtherService'); // <--- Comes from the SomeService dependancy
Когда мы unit test контроллеры, мы можем имитировать сервисы, которые передаются либо полностью, либо с помощью шпионов жасмина. Можем ли мы выполнить ту же самую сортировку в директивах unit test, чтобы я не следил за тропой зависимостей?