0

Я использую 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.

ответ