2017-01-12 3 views
2

Итак, вот мой тест:Как выполнить модульный шаблон с угловым 1.5 компонентом?

describe('My Test', function(){ 

    var $componentController, $compile, controller, scope; 

    beforeEach(inject(function($injector, $rootScope, $templateCache){ 

    $templateCache.put('my-component.html', '<h1>{{ $ctrl.foo }}</h1>'); 

    $componentController = $injector.get('$componentController'); 

    var bindings = { 
     foo: 'A Foo' 
     }; 

    scope = $rootScope.$new(); 

    controller = $componentController('myComponent', { $scope: {} }, bindings); 

    })); 

    it('should render the correct html', function(){ 

    scope.foo = 'Changed Foo'; 

    var element = angular.element(
     '<my-component foo="Original Foo"></my-component>' 
    ); 

    var template = $compile(element)(scope); 

    scope.$digest(); 

    var templateAsHtml = template.html(); 

    console.log(templateAsHtml); 

    }; 

} 

И что я получаю "Original Foo", не "Измененный Foo". Поэтому, даже если я изменяю переменную scope.foo в своем тесте, она использует ту, что находится на компоненте (или на контроллере).

Итак, любая идея о том, как изменить переменные компонента в тесте, поэтому при компиляции шаблона он ловит эти изменения.

В основном я хочу иметь доступ и изменять переменные контроллера, поэтому я могу проверить определенный выход в зависимости от значений переменных контроллера. Имеет ли это смысл?

+1

Вы не отправляли код компонента, необходимо здесь. Трудно поверить, что '{{foo}}' приводит к 'Original Foo', потому что предполагается, что в шаблоне компонента используется' $ ctrl.foo' (или что-то вроде controllerAs). – estus

+0

В шаблоне компонента используется '$ ctrl.foo' (я уже изменяю это сообщение), и привязки те же, что и те, которые я положил на тест, поэтому здесь нет необходимости вставлять этот дополнительный код. – arielcr

ответ

4

scope.foo не влияет на привязки компонентов. foo scope свойство не foo атрибут.

Это, вероятно, должно быть проверено, как

var component = $compile('<my-component foo="{{ foo }}">')(scope); 

scope.$digest(); 

var componentScope = component.isolateScope(); 

expect(component.html())... 
expect(componentScope.$ctrl.foo)... 
+0

Спасибо за ваш Ответить! Но это не работает для меня. На самом деле, если я делаю 'console.log (componentScope. $ Ctrl.foo);' то, что я получаю, является исходным значением, установленным на компонентном контроллере. В основном я хочу иметь доступ и изменять переменные контроллера, поэтому я могу проверить определенный вывод в зависимости от значений переменных контроллера. Имеет ли это смысл? – arielcr

+0

Я не думаю, что это добавляет ценность для теста. Тестирование для исходного значения достаточно. Проверяя «измененное значение», вы пытаетесь проверить не свой собственный код, а угловой компилятор, который уже был проверен командой Angular. Я предполагаю, что это возможно сделать после * '$ compile (...) (scope); scope $ digest() 'with' scope.foo = ...; Объем. $ дайджест() '. Тогда 'componentScope. $ Ctrl.foo' должен быть равен' scope.foo'. Но опять же, это совершенно не нужно. – estus

+0

Это был просто пример, на самом деле я не опубликовал весь свой настоящий код. Но в любом случае вы дали мне представление о том, как изменить переменные области компонента с помощью 'componentScope. $ Ctrl.foo = 'новое значение', а затем изменить нужные мне переменные, а затем« scope. $ Digest »then I может просто использовать 'expect (component.find ('button'). length) .toEqual (2)' (или какое-либо условие, которое мне нужно проверить) – arielcr

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