Я использую Smart Table и пытаюсь получить некоторые тесты, настроенные с кармой. Я неоднократно получаю ошибку Error: [$compile:ctreq] Controller 'stTable', required by directive 'removePag', can't be found!
. При использовании директивы я не получаю никаких ошибок. Мне кажется, что Karma должна сделать смарт-таблицу доступной для модуля tools
, что я имею в виду в спецификации, но без кубиков. Как я могу быть уверен, что stTable
доступен для тестирования removePag
?Как обеспечить, чтобы контроллер вводился в директиву для тестирования?
В tools.js (в том числе expose
, потому что я подозреваю, что это может быть вовлечен, как это директива связана с верхнего уровня st-table
):
angular.module('tools', ['smart-table']);
angular
.module('freeTools')
.directive('expose', exposeTableState)
.directive('removePag', removePag)
function exposeTableState(){
return {
require:'stTable',
link:function(scope, element, attr, ctrl){
scope.smartTableState=ctrl.tableState();
}
};
}
function removePag() {
return {
restrict: 'E',
require: '^stTable',
template: '<a href="">View as a single page</a>',
link: function(scope, element, attrs, ctrl) {
return element.bind('click', function() {
return scope.$apply(function() {
var tableState;
tableState = ctrl.tableState();
tableState.pagination.number = tableState.pagination.totalItemCount;
return ctrl.pipe();
});
});
}
};
}
В toolsSpec.js:
describe('tools', function() {
var $compile,
$rootScope;
beforeEach(module('freeTools'));
beforeEach(inject(function(_$compile_, _$rootScope_){
$compile = _$compile_;
$rootScope = _$rootScope_;
}));
it('Replaces the element with the appropriate content', function() {
var element = $compile("<remove-pag></remove-pag>")($rootScope);
$rootScope.$digest();
expect(element.html()).toContain("View as a single page");
});
}
В Karma.conf:
module.exports = function(config){
config.set({
basePath : '../../',
files : [
'bower_components/jquery/dist/jquery.js',
'bower_components/angular/angular.js',
'bower_components/angular-smart-table/dist/smart-table.js',
'bower_components/angular-mocks/angular-mocks.js',
'assets/scripts/*.js',
'assets/test/*.js'
],
autoWatch : true,
frameworks: ['jasmine-ajax', 'jasmine'],
browsers : ['Chrome'],
plugins : [
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-jasmine-ajax',
'karma-jasmine',
],
});
};
Упрощенная HTML:
<section ng-app="tools">
<table st-table="data" st-safe-src="safe" expose>
<div st-pagination>
<remove-pag></remove-pag>
Я понимаю, что вопрос очень похож на Unit testing an AngularJS (Smart Table) directive. Подражание тому, как смарт-таблицы тестируют свои собственные контроллеры, тоже не работало, как было предложено там. Во всяком случае, stTable
в исходном коде модуля, по-видимому, является директивой, а не контроллером.
Я также попытался обернуть элемент с помощью st-table в тесте, например $compile("<table st-table><remove-pag>...
с той же ошибкой.
Я рассматривал такие проблемы, как Controller Required By Directive Can't Be Found, но у меня уже есть общий родитель, tools
.