即使该类不存在,Angular hasClass也返回true

时间:2016-11-22 17:51:06

标签: angularjs class testing jasmine ng-hide

在另一个令人兴奋的分期中,你正在做什么,tbm?",我有一个测试(不可否认的是在[改变]之前通过但是现在)由于明显的课程存在而失败尽管所有人都努力证明不是这样。

上下文:

显示参赛者名单,每个参赛者都可以评分或评分。在参赛者的内部,相关(按类别)参赛者将在摘要中显示。在参赛者本身通过其自己的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()认为它是?

[变更]

根据git bisect,导致测试开始失败的更改是在一个不相关的指令中。但即使改变是直接相关的,我也没有看到除了hasClass()之外的每个人都认为这个类没有。

更新

挖掘jquery代码(hasClass()使用jquery,如果已安装),如果element的任何子元素具有类&#34,则element.hasClass(&#34; foo&#34;)将返回true。 ; foo&#34;,即使元素本身没有。 WTF,jquery?

1 个答案:

答案 0 :(得分:0)

显然这是由&#39; div&gt;引起的。 DIV&#39;选择器从父元素递归到具有ng-hide类的子节点。

修复:

var score_container = other.find('div > div').eq(0);