2014-02-06 7 views
0

Когда я настраивал тесты, используя только компиляцию и ссылку, директива запускается, но элемент существует только в limbo, потому что нижеприведенные тесты терпят неудачу, если я явно не добавляю их в DOM.Должен ли я добавлять исходный или скомпилированный/связанный элемент в тело при тестировании?

Я просто задаюсь вопросом, нужно ли добавлять предварительно скомпилированный angular.element(...) в DOM или скомпилированный/связанный linkFr(scope), или если я собираюсь все это сделать неправильно.

Test Setup

beforeEach(inject(function ($rootScope, $compile) { 

    var linkFn, el; 

    rootScope = $rootScope; 

    scope = $rootScope.$new(); 

    el = angular.element('\ 
     <a id="testClickConfirm" href="" ng-click="deleteFn()" click-confirm="Test confirmation message">Delete</a>\ 
    '); 

    // $('body').append(el); 

    // The $compile method returns the directive's link function 
    linkFn = $compile(el); 

    // The link function returns the resulting DOM object 
    element = linkFn(scope); 

    $('body').append(element); 

})); 

Тесты

Пока я называю либо $('body').append(el); или $('body').append(element); все тесты проходят, в противном случае все они терпят неудачу.

it('should be added to dom',function(){ 

    expect(element).toExist(); 
    expect(element).toBeInDOM(); 
    expect(element).toBeVisible(); 

    expect(el).toExist(); 
    expect(el).toBeInDOM(); 
    expect(el).toBeVisible(); 

    expect($('#testClickConfirm')).toExist(); 
    expect($('#testClickConfirm')).toBeInDOM(); 
    expect($('#testClickConfirm')).toBeVisible(); 

})); 
+0

Не могли бы вы предоставить сценарий Plunker? –

+0

@MichaelBenford Весь код здесь и работает. Это просто вопрос, какой метод правильный, если они одинаковы или лучше другой метод. –

+0

Я попросил сценарий, потому что сначала я не признавал вызовы toExist() ',' toBeInDOM() 'и' toBeVisible() 'и думал, что они были псевдокодами. Но после быстрого поиска Google я обнаружил, что они являются реальными функциями (и очень полезными, кстати). :) –

ответ

1

Насколько мне известно, вам нужно только добавить элемент в DOM, когда ваш тест основан на браузере, чтобы вычислить что-то (например, размером элемента). Если это не требуется, вы можете оставить его в «limbo».

В случаях, когда необходимо, чтобы элемент находился внутри DOM, использование скомпилированной версии в основном будет достаточно. Я не могу придумать какой-либо сценарий, когда добавление «сырого» элемента в DOM перед его компиляцией было бы полезно.

+0

ОК спасибо. У меня была проблема с этим методом, хотя, похоже, что после каждого теста он не будет очищен. Должен ли я делать это вручную? –

+0

Также как использовать jasmine-jquery 'setFixtures()'. Будет ли автоматическая очистка? –

+0

@ ogc-nick То, что я обычно делаю в таких случаях, это издеваться над телом тела, чтобы я мог автоматически очищать его после каждого теста без каких-либо усилий. Взгляните на этот [другой ответ] (http://stackoverflow.com/questions/20313575/angular-js-unit-test-mock-document/20366087#20366087) для получения более подробной информации. –