2016-11-22 6 views
0

В еще одном захватывающем выпуске «что вы делаете, tbm?», У меня есть тест, который (по общему признанию, проходил до [изменений], но сейчас) терпит неудачу из-за присутствующий кажущийся класс, несмотря на все попытки доказать обратное.Угловой hasClass возвращает true, даже если класс отсутствует

Контекст:

список участников показано, каждый из которых может быть оценен или насечки. Внутри абитуриента, связанные (по категориям) абитуриенты показаны в резюме. Суммарная оценка участника не отображается до тех пор, пока сам участник не будет оценен через свой собственный div. Этот тест проверяет это поведение.

Тест:

it('related items are hidden until scored', function() { 

    expect(judgeService.entrants[2].rating.score).toBe(0); 

    var other = angular.element(element.find('.competition')[0]); 
    var score_container = other.find('div > div'); 
    expect(score_container.hasClass('ng-hide')).toBe(true); 

    judgeService.entrants[2].rating.score = 3; 
    scope.$digest(); 

    // We'll refer to this later 
    console.log('HTML: ' + other.html()); 
    console.log('CLASS: ' + score_container.attr('class')); 

    // failure here 
    expect(score_container.hasClass('ng-hide')).toBe(false); 
}); 

HTML:

 <div class="competition" 
      ng-repeat="other in item.related"> 
      <div> 
       {{ other.name }}<br/> 
       <!-- this becomes the div > div in the test --> 
       <score-block item="other" ng-show="other.rating.score"></score-block> 
      </div> 
     </div> 

Выход:

LOG: 'HTML: 
      <div class="ng-binding"> 
       Andres<br> 
       <div class="ng-isolate-scope" ng-class="{error: vm.error}" item="other" ng-show="other.rating.score"> 
[ skippy bits ]' 

LOG: 'CLASS: ng-isolate-scope' 

Так что, да, класс не присутствует на элементе .. так почему hasClass () Думаете, это так?

[изменения]

Per мерзавца разрез`ать, изменение, которое вызвало тест, чтобы начать провал был в несвязанной директивы. Но даже если изменение было напрямую связано, я не вижу, как все, но hasClass() сообщают, что класс отсутствует.

Update:

Рытье через код JQuery (hasClass() использует JQuery, если он установлен), то оказывается, что element.hasClass («Foo») вернет истину, если какой-либо из дочерних элементов элемента имеет класс " foo ", даже если сам элемент отсутствует. WTF, jquery?

ответ

0

По-видимому, это вызвано селектором 'div> div', возвращающимся из родительского элемента в дочерний элемент, который имеет класс ng-hide.

Исправление:

var score_container = other.find('div > div').eq(0); 
Смежные вопросы