isolateScope () дает undefined - директивы модульного тестирования с кармой

Как указано в заголовке вопроса, я получаю неопределенность при вызове isolateScope(). Я попытался выполнить модульное тестирование своей директивы Angular на основе инструкций, приведенных в модульном тестировании директив AngularJS с Внешние шаблоны.

Вот мой код:

directive.js

angular.module("myTestApp")
  .directive("testDirective", function(){
    return{
      restrict: "E",
      require: "ngModel",
      scope:{
        ngModel: "=",
        label: "@?"
      },
      templateUrl: "/mypath/templates/testDirective.html",
      link: function($scope, element, attributes, ngModelCtrl){
        $scope.functions = {},
        $scope.settings = {
          label: $scope.label ? $scope.label : ""
        }
      }
    };
  });

Я использовал karma-ng-html2js-preprocessor для templateUrl.

karma.conf.js (Код содержит только те части, которые связаны с ng-html2js)

files:[
  //All Js files concerning directives are also included here...
  '/mypath/templates/*.html'
],

preprocessors: {
  '/mypath/templates/*.html': [ng-html2js']
},

ngHtml2JsPreprocessor: {
  moduleName: 'template'
},

plugins: ['karma-*'],

directiveSpec.js

describe("testDirective Test", function(){
var scope, $compile,$httpBackend, template;

beforeEach(module('myTestApp'));
beforeEach(module('template'));

beforeEach(inject(function($rootScope, _$compile_, _$httpBackend_){
    scope = $rootScope.$new();
    $compile = _$compile_;
    $httpBackend = _$httpBackend_;
}));

it("should check if the value of label attribute id set to dummyLabel", function(){
    $httpBackend.expect('GET','/mypath/templates/testDirective.html').respond();
    scope.label = 'dummyLabel';
    var element = angular.element('<test-directive label= "label" ></test-directive>');

    element = $compile(element)(scope);
    console.log(element);
    scope.$digest();
    console.log('Isolate scope: '+ element.isolateScope());
    expect(element.isolateScope().label).toEqual('dummyLabel');
});

});

Здесь console.log(element); печатает {0: <test-directive label="label" class="ng-scope"></test-directive>, length: 1}

Проблема: console.log('Isolate scope: '+ element.isolateScope()); дает undefined.

Я просмотрел эту проблему по многим вопросам в StackOverflow, но не смог найти правильного решения.

Кроме того, я должен использовать $httpBackend для получения html-файла, иначе он выдает ошибку Unexpected Request.

Я был бы очень благодарен за любую помощь, так как я застрял в этой ошибке с прошлой недели!


person Jagrut    schedule 21.12.2015    source источник


Ответы (2)


Здесь только предположение на первый взгляд, но...

Ваш .respond() должен что-то вернуть. Прямо сейчас вы перехватываете запрос к своему шаблону и ничего не отвечаете, что приводит к пустым данным и неопределенности isolateScope().

person BowlerDo0d    schedule 21.12.2015
comment
Уже пытался передать содержимое element в вызове .respond(). Не сработало. - person Jagrut; 21.12.2015

Для тех, у кого может быть такая же проблема:

Директивное тестирование не работает должным образом при использовании $httpBackend для имитации файлов HTML. Это должно быть, и это возможно, чтобы включить файлы HTML, просто используя плагин ng-html2js. Поэтому я удалил вызовы $httpBackend и использовал stripPrefix для правильного включения файлов HTML в качестве модулей. Это сработало!

Надеюсь, это поможет кому-то еще!

person Jagrut    schedule 22.12.2015
comment
Значит, вы не использовали beforeEach(module('templates'))? Вы правильно добавили html файл? Я сталкиваюсь с ошибками с этим. - person Winnemucca; 09.03.2016
comment
@stevek С плагином ng-html2js вам не нужно включать модуль в каждый тестовый файл. Вы можете напрямую записать его в свой файл конфигурации, и он будет автоматически доступен в вашем тестовом примере. Пожалуйста, укажите мне на свой вопрос о SO или предоставьте мне более подробную информацию. - person Jagrut; 14.03.2016
comment
Вот ссылка на мой вопрос stackoverflow.com/questions/35854470/ . Я застрял с возвратом пустых строк в свои html-файлы. Я ссылаюсь на файлы как HTML в моем karma.conf.js. Мне интересно, нужно ли напрямую ссылаться на файлы templateCached внутри массива файлов? - person Winnemucca; 14.03.2016