【问题标题】:How do I trigger a mousemove event in an angularjs unit test如何在 angularjs 单元测试中触发 mousemove 事件
【发布时间】:2015-04-17 18:49:30
【问题描述】:

我已经实现了一个使用鼠标事件的 angularjs 指令;单击组件并向上或向下移动鼠标可以更改值。 所以我需要知道如何在单元测试中触发 mousemove 事件(我使用 karma/jasmine); 我想建议在单元测试中鼠标上下移动时测试这个组件。

组件模板是这样的:

<div class="rotativeContent">
    <p class="rotativeLabel">{{label}}</p>
    <pie class="zero"></pie>
    <p class="rotativeValue">{{ngModel}}</p>
    <input type="hidden" ng-model="ngModel"/>
</div>

而javascript代码是:

var Component = angular.module('Components', []);

Components.directive('rotative', ['$document', function($document){
    return {
    require : '?ngModel',
    restrict: 'E',
    replace: true,
    templateUrl: "templates/rotative.html",
    scope: {label: "@", ngModel: "="},
    link: function(scope, element, attr, ngModel) {
        var value = 0;
        function bindElementMove() {
            element.bind('mousedown', function (event) {
                $document.bind('mousemove', mousemove);
                $document.bind('mouseup', mouseup);
            });
        }

        bindElementMove();

        function mousemove(event) {
            // code on mouse move
            // to track vertical mouse position
            var prevY = element.attr('data-prevY');
            if (event.pageY < prevY) {
                // do something if mouse goes down
                // ...
                value++;
            } else {
                // do something if mouse goes up
                // ...
                value--;
            } 
            element.attr('data-prevY', event.pageY);
            ngModel.$setViewValue(value);
        }

        function mouseup() {
            $document.off('mousemove', mousemove);
            $document.off('mouseup', mouseup);
        }
    }
};

// ...

我还需要模拟 event.pageY 的变体。我该怎么做?

【问题讨论】:

    标签: javascript angularjs unit-testing bdd karma-jasmine


    【解决方案1】:

    这篇博文展示了一个使用 jqLit​​e 的 triggerHandler() 的示例。

    Triggering Events in Angular JS Directive Tests

    编辑: 好的,我很快做了一个 Plunker 来演示如何传递参数:link。检查控制台输出以查看事件对象的参数。您可以添加您的实施可能需要的任何内容。

    所以你可以像这样传递数据,例如:

    elem.triggerHandler({
        type : "mousemove",
        pageX: 48,
        pageY: 102
    });
    

    因此,您需要使用angular.element 获取元素的句柄,然后使用上面的代码触发其上的事件。

    【讨论】:

    • 感谢 juunas 的回复;我需要知道如何模拟鼠标上下移动(event.pageY)来测试对应的值是否正确。你能给我一些关于那个的吗?
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多