代码之家  ›  专栏  ›  技术社区  ›  CodeZila

Angular JS中focus next自定义指令的测试用例

  •  0
  • CodeZila  · 技术社区  · 6 年前

    我创建了一个自定义指令来解决应用程序中一些与焦点相关的问题。

    指令代码:

    (function() {
        angular.module("FocusNextModule", []).directive("focusNext", function() {
            return {
                restrict: "A",
                link: function($scope, elem, attrs) {
                    elem.bind("focus", function(e) {
                        var code = e.which || e.keyCode;
    
                        var nextElem = document.getElementById(attrs.focusNext);
                        if (nextElem === null || nextElem === undefined) {
                            var altElem = document.getElementById(attrs.focusNextAlt);
                            if (angular.element(altElem).hasClass('ng-hide') === false) {
                                altElem.focus();
                            } else {
                                var selfElem = document.getElementById(attrs.focusSelf);
                                selfElem.focus();
                            }
                            e.preventDefault();
                        } else {
                            nextElem.focus();
                            e.preventDefault();
                        }
                    });
                }
            };
        });
    })();
    

    如何在模板中使用in template

    <md-button id="idOfElementC">MyButton</md-button>    
    <div tabindex="0" focus-next="idOfElementA" focus-next-alt="idOfElementB" focus-self="idOfElementC"></div>
    

    注: id为“idOfElementC”的元素将刚好位于使用focus next指令的div之上。

    指令是如何工作的?

    当我们用“idOfElementC”id(此处按钮)在元素上按tab键时,focus将使用focus next指令转到div。div将使用以下情况将焦点重定向到其他元素:

    a)首先它将检查是否有任何id为“idOfElementA”的元素。如果元素存在,则该元素将接收焦点。

    b)如果ID“IDFoelEntA”元素不存在,则“IdoFelEngB”将接收焦点。

    c)如果ID“IDFoelEntB”元素也不存在,那么最终“IdoFeleMeta”(在哪个标签被按下)将接收焦点。

    该指令运行良好,解决了我所有的问题。但是,我需要为这个指令编写jasmine测试用例。

    有人能教我怎么写吗 茉莉 聚焦测试用例?

    更新: 根据@PetrAveryanov的评论,这个指令看起来很糟糕,我完全同意。

    更新指令:

    (function() {
        angular.module("FocusNextModule", []).directive("focusNext", function() {
            return {
                restrict: "A",
                link: function($scope, elem, attrs) {
                    elem.bind("focus", function(e) {
                        var elemToFocus = document.getElementById(attrs.focusNext) || document.getElementById(attrs.focusNextAlt);
                        /*jshint -W030 */
                        angular.element(elemToFocus).hasClass('ng-hide') === false ? elemToFocus.focus() : document.getElementById(attrs.focusSelf).focus();
                        e.preventDefault();
                    });
                }
            };
        });
    })();
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   CodeZila    6 年前

    最后,了解如何为指令编写测试用例。

    describe('focus-next-directive test', function() {
        var compile, scope;
    
        beforeEach(module(FocusNextModule));
    
        beforeEach(inject(function($compile, $rootScope) {
            compile = $compile;
            scope = $rootScope.$new();
        }));
    
        it('should focus the next element', function() {
            var div = compile('<div tabindex="0" focus-next="idTestNext"/>')(scope);
            var nextElem = compile('<input id="idTestNext" type="text" />')(scope);
            angular.element(document.body).append(div);
            angular.element(document.body).append(nextElem);
            div.focus();
            expect(nextElem).toEqual(angular.element(document.activeElement));
            div.remove();
            nextElem.remove();
        });
    
        it('should focus the next alternative element', function() {
            var div = compile('<div tabindex="0" focus-next="idTestNext" focus-next-alt="idTestNextAlt"/>')(scope);
            var nextAltElem = compile('<input id="idTestNextAlt" type="text" />')(scope);
            angular.element(document.body).append(div);
            angular.element(document.body).append(nextAltElem);
            div.focus();
            expect(nextAltElem).toEqual(angular.element(document.activeElement));
            div.remove();
            nextAltElem.remove();
        });
    
        it('should focus the Self element', function() {
            var selfElem = compile('<input id="idTestSelf" type="text" ng-class="ng-hide"/>')(scope);
            var div = compile('<div tabindex="0" focus-next="idTestNext" focus-next-alt="idTestNextAlt" focus-self="idTestSelf"/>')(scope);
            var nextAltElem = compile('<input id="idTestNextAlt" type="text" class="ng-hide"/>')(scope);
            angular.element(document.body).append(selfElem);
            angular.element(document.body).append(div);
            angular.element(document.body).append(nextAltElem);
            div.focus();
            expect(selfElem).toEqual(angular.element(document.activeElement));
            div.remove();
            selfElem.remove();
            nextAltElem.remove();
        });
    });