2013-04-15 11 views
29

Jak sprawdzić, czy element jest widoczny lub ukryty w testowym (jaśminowym)?Testowanie, czy pewne elementy są widoczne czy nie

Moje DOM wygląda następująco:

<div class="span5 value-entry"> 
    <input type="text" ng-model="query.value" placeholder="Enter value" class="input-large" ng-show="genericInput(criteria.attribute)"> 
    <select ng-model="query.value" ng-options="entry for entry in filteredValue(criteria.attribute)" class="input-medium" ng-show="!genericInput(criteria.attribute)"> 
     <option value="">-- Select Value --</option>. 
    </select> 
</div> 

Albo wybierz pokazanej lub polu tekstowym, ale nie jednocześnie. Chciałbym sprawdzić, który element jest widoczny (na podstawie innych kryteriów), ale nie potrafię wymyślić, jak uruchomić kod. Napisałem następujący kod:

expect(element('.value-entry input').is(':visible')).toBe(true); 

ale pojawia się błąd:

TypeError: Object #<Object> has no method 'is' 

Jak mogę sprawdzić, czy wejście jest widoczny i select jest ukryta w tym samym czasie (i vice versa) ?

EDIT: Pragnę dodać, że jest to koniec Koniec Testu

+0

Zobacz też to pytanie: http://stackoverflow.com/questions/16703276/angular-watch- for-ngshow-nghide-changes-in-ancestors-that-affect-child-dom-ele dla rozwiązania, które uwzględnia także widoczność przodków. – lanoxx

Odpowiedz

48

To zachowanie zmieniło się w kątowe 1.2 powodu ng-animate.

Kod dla ngShow jest:

var ngShowDirective = ['$animate', function($animate) { 
    return function(scope, element, attr) { 
    scope.$watch(attr.ngShow, function ngShowWatchAction(value){ 
     $animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide'); 
    }); 
    }; 
}]; 

Co oznacza, że ​​będzie dodać/usunąć klasę ng-hide ukryć/pokazać element.

Tak więc, na przykład, we właściwy sposób, aby sprawdzić, czy dany element jest ukryty byłoby:

expect(element.find('.value-entry input').hasClass('ng-hide')).toBe(true); 
+4

To powinna być nowa odpowiedź, ponieważ zmieniło się to, jak elementy są ukryte.Jednak użycie metody .hasClass() może być nieco łatwiejsze dla oczu. – chris

+0

Istnieje "hasClass()" w Jasmine? – georgiosd

+0

@georgiosd: angular.element ma metodę _hasClass_ – null

6

Widoczność testową

Domyślnie wyświetlacz jest ustawiony na inline dla wejścia i inline-block dla wybranych. W związku z tym można określić, czy którekolwiek z nich są obecnie pokazywane przez testowanie pod kątem istnienia domyślnej właściwości CSS.

expect(element('.value-entry input').css('display')).toBe('inline'); 
expect(element('.value-entry select').css('display')).toBe('inline-block'); 

Aby sprawdzić, czy są ukryte albo wymienić inline i inline-block z czekiem na none, czyli jak ngShow ukrywa element.

expect(element('.value-entry input').css('display')).toBe('none'); 
expect(element('.value-entry select').css('display')).toBe('none'); 
+2

Ten test jest ściśle związany z implementacją programu ng-show, który dodaje kruchość. Używanie selektora zasugerowanego przez "Shadowedged" do identyfikowania widocznych elementów odradza logikę testu widoczności i sprawia, że ​​testy są dalej od wdrożenia. – daddywoodland

+0

To ma jednak sens, ale ciągle otrzymuję element nie jest funkcją w typie błędu – Winnemucca

14

Byłeś blisko. Jednak tutaj jest jak należy przetestować widoczności:

expect(element('#some-id:visible').count()).toBe(1); 
+1

** Heads up! ** To zadziała tylko wtedy, gdy masz jQuery włączone, w przeciwnym razie to nie zadziała powodując błąd podobny do: ' Wyszukiwanie elementów za pomocą selektorów nie jest obsługiwane przez jqLite! 'Sprawdź tutaj, aby uzyskać więcej szczegółów: http://embed.plnkr.co/g5ZdYpLrKWR1u8R0GOB9/ (nie zapomnij otworzyć konsoli). –

Powiązane problemy