2

我想为各种自定义 angularjs 指令编写单元和 e2e 测试,这些指令将 javascript 事件绑定添加到它们所附加的元素。

在测试中,使用 jQuery 方法很容易模拟 click 和 dblclick 事件。

element("#id").click();

但是,我还绑定了 mouseover、mouseout 和 contextmenu 事件,并且还没有找到在 e2e 测试中调用这些事件的方法。下面的代码显示了我正在采用的方法。

it('should show a context menu when the user right clicks on a grid row', 
    function () {
    //not currently triggering the context menu
    var outerRow = element(".ngRow", "outer row");
    var row = element(".ngRow:first > div", "row");
    angular.element(row).triggerHandler("contextmenu");
    expect(outerRow.attr("class")).toContain("open");
});

如何在测试中触发 contextmenu 事件?

同样,在指令的单元测试中,我希望能够检测事件绑定是否已附加到元素。

我怎样才能做到这一点?

4

1 回答 1

4

最终走到了这一步。要触发使用 jQuery 选择的元素上的事件,显然需要加载 jQuery。问题在于,正如这里所解释的,Angular 运行器在没有加载 jQuery 的 IFrame 中运行测试。

但是,您可以扩展 Angular 场景 dsl 以在加载 jQuery 的 e2e 测试的上下文中执行代码。下面的函数使您能够执行任何 javascript 方法,或触发任何事件:

//this function extends the Angular Scenario DSL to enable JQuery functions in e2e tests
angular.scenario.dsl('jqFunction', function () {
    return function (selector, functionName /*, args */) {
        var args = Array.prototype.slice.call(arguments, 2);
        return this.addFutureAction(functionName, function ($window, $document, done) {
            var $ = $window.$; // jQuery inside the iframe
            var elem = $(selector);
            if (!elem.length) {
                return done('Selector ' + selector + ' did not match any elements.');
            }
            done(null, elem[functionName].apply(elem, args));
        });
    };
}); 

以下代码使用上述函数在 e2e 测试中触发 contextmenu 事件:

it('should show a context menu when the user right clicks on a grid row', function () {
    var outerRow = element(".ngRow:first", "outer row");
    jqFunction(".ngRow:first > div", "contextmenu");
    expect(outerRow.attr("class")).toContain("open");
});
于 2013-07-23T09:59:23.530 回答