2015-10-15 2 views
0

У меня есть директива, в которой контроллер определяется как часть определения директивы.Единичное тестирование Угловые контроллеры Js с использованием Karma

(function(){ 
    var app = angular.module('app', []); 
    app.directive('test', function(){ 
    return { 
    restrict: 'E', 
    templateUrl: 'test.html', 
    controller: ['$scope', function ($scope){...*set of functions*......}], 
    controllerAs:'reportCtrl', 
    link:function(Attrs){ 
     } 
    }; 
    }); 
})(); 

Мне нужно написать модульное тестирование для набора функций. Я новичок в тестировании кармы, и я не нашел много ресурсов для такого кода. Я почти пробовал все возможные пути. Может кто-нибудь помочь мне написать модульный тест для этого

+0

Возможный дубликат [углового блока JS тестирования контроллера] (http://stackoverflow.com/questions/33134566/angular-js-unit-testing-a-controller) – angmerica

ответ

0

Вот пример. См. Демо http://plnkr.co/edit/zK9MNkvNpHF2UY9BgMKz?p=preview

Что я сделал, это скомпилировать директиву и вызвать цикл дайджеста. После настройки он почти такой же, как обычный контроллер.

describe('Auth Service Tests', function() { 
    var element; 
    var isolated; 
    var $scope; 
    beforeEach(module('MyApp')); 
    beforeEach(inject(function($rootScope, $compile, $templateCache) { 
    // Imports test.html 
    var templateUrl = 'test.html'; 
    var req = new XMLHttpRequest(); 
    req.onload = function() { 
     $templateCache.put(templateUrl, this.responseText); 
    }; 
    req.open('get', templateUrl, false); 
    req.send(); 


    $scope = $rootScope.$new(); 

    element = '<test></test>'; 
    // Creates the directive. 
    element = $compile(element)($scope); 

    // activates the $digest cycle. 
    $scope.$apply(); 
    })); 

    it('tests the transclude', function() { 
    expect($scope.apple).toEqual('world'); 
    expect($scope.getApple()).toEqual('world'); 
    }); 

}); 
+0

Спасибо .. У меня есть template Url: ../test/test/test.html, и я пишу модульные тесты в другой папке. Должен ли я указать путь к test.html из палитры единичных тестов в $ templateCache.put. Я получаю сообщение об ошибке: GET ../test/test/test.html – vino

+0

Да, вы должны изменить пример, чтобы он соответствовал вашему пути. В качестве альтернативы вы можете использовать ngHtml2JsPreprocessor. http://stackoverflow.com/questions/15214760/unit-testing-angularjs-directive-with-templateurl Это превратит ваш html в js и поместит его в один модуль. Таким образом вам не нужно использовать $ templateCache. – angmerica

+0

Если мы используем ngHtml2JsPreprocessor, нам просто нужно загрузить модуль, и мы можем избежать правильного кэша шаблонов? – vino

Смежные вопросы