【问题标题】:Simulate mouse click with Jasmine Unit testing使用 Jasmine 单元测试模拟鼠标点击
【发布时间】:2011-12-06 15:53:05
【问题描述】:

我是 Jasmine 的新手,到目前为止已经能够设置几个基本测试。我现在要做的是创建一个测试来模拟元素上的鼠标单击事件,例如 div、标签等

我的测试应该能够确定单击链接时是否会扩展 div 容器 - 我通过它的类名确定这一点。

我的源代码有一个监听点击事件的事件监听器:

MYSITE.$("sites.retail.UI.Product").Filter = (function () {

    var STATE = MYSITE.system.BitState;
    var NODE = MYSITE.system.DOM.node;

    function _constructor() {
        var _searchContainer = document.getElementById("filterWidget");
        this.toggle = document.getElementById("filterHeader");
        var _self = this;
        MYSITE.system.event.attach(_searchContainer, "click",
            function (e) {
                if (NODE.hasClassName(e.target, "filterHeader")) {
                    if (!STATE.Manager.isFlagSelected('Global', null, STATE.Flags.Global.ProductListShowRefinements)) {
                        _self.collapse();
                    } else {
                        MYSITE.system.DOM.node.removeClassName(document.getElementById('filterCollapse'), "hide")
                        _self.expand();
                    }
                    e.prevent();
                }
                else if (NODE.hasClassName(e.target, "showMoreCont")) {
                    NODE.addClassName(NODE.getElementsByClassAndTagName(_searchContainer, "searchShowMoreCount", "div")[0], "hide");
                    NODE.removeClassName(NODE.getElementsByClassAndTagName(_searchContainer, "hiddenSearchContent", "div")[0], "hide");
                    e.prevent();
                }
                else if (NODE.hasClassName(e.target, "showLessCont")) {
                    NODE.removeClassName(NODE.getElementsByClassAndTagName(_searchContainer, "searchShowMoreCount", "div")[0], "hide");
                    NODE.addClassName(NODE.getElementsByClassAndTagName(_searchContainer, "hiddenSearchContent", "div")[0], "hide");
                    e.prevent();
                }
            }
        );



        _constructor.base.constructor.call(this, document.getElementById("filterWidget"), STATE.Manager.isFlagSelected('Global', null, STATE.Flags.Global.ProductListShowRefinements));
        return this;
    }
    _constructor.extend(MYSITE.UI.Collapse);

    _constructor.prototype.collapse = function (settings) {
        this.toggle.className = "filterHeader closed"; //Set explicitly rather than addNew
        STATE.Manager.setFlag('Global', null, parseInt(STATE.Flags.Global.ProductListShowRefinements));
        _constructor.base.collapse.call(this, { steps: '1' });
    }

HTML 标记是

<div id="filterWidget">
<a class="filterHeader closed" id="filterHeader" href="#">
<span class="filterHeader">Refine your search</span>
</a>
<div class="collapsible" id="filterCollapse">
<div class="content">
</div></div></div>

我正在尝试的单元测试是:

describe("Filter", function() {

    it("should use collapse function", function() {
        loadFixtures('fixture.html');
        var filter = new MYSITE.sites.retail.UI.Product.Filter();

        jQuery.noConflict();
        var btn = jQuery("#filterHeader");
        var click = jQuery.Event('click');
        btn.trigger(click);

        expect(filter.toggle.className).toEqual("filterHeader open");
    });

});

但源代码似乎从未拾取点击事件。

我做错了什么?

提前致谢

【问题讨论】:

  • 使用 createevent 和 initevent 方法找到答案: var e = document.createEvent("MouseEvents"); e.initEvent("点击", true, false); toggleBtn.dispatchEvent(e);

标签: javascript unit-testing jasmine jasmine-jquery


【解决方案1】:

jquery 的trigger 方法既不会在浏览器上创建真实事件,也不会调用使用addEventListener 等核心js 方法注册的事件处理程序!

在 github 上有一个项目供 jquery 团队在测试涉及原生浏览器事件时使用,这里是插件:https://github.com/eduardolundgren/jquery-simulate

这个想法是,当一个真正的事件开始流动时,它最终会调用一个 jquery 处理程序,而且好处是,即使是其他类型的未注册 jquery 的处理程序也会响应。

【讨论】:

    【解决方案2】:

    问题是查询触发的事件默认没有目标对象。试试这个:

    var click = jQuery.Event("click", { target: $('<div class="">test</div>') });
    

    【讨论】:

    • 感谢我遇到的问题是源代码没有获取点击事件。如果我在 Jasmine 规范的“it”块中绑定一个点击侦听器,这将获取点击事件。所以点击被正确触发,但代码没有拿起它,有什么想法 - 这是茉莉花的限制吗?
    • 嗨@Andreas,我想在我的单元测试中触发'mouseenter',但不是运气!我可以为这个活动添加目标吗?你有这方面的文件吗?谢谢!
    • 我认为您可以像$el.trigger('mouseenter') 这样简单地触发元素上的事件。这应该表现得像一个正常事件。如果没有,请打开一个新问题。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2016-10-03
    • 2023-04-07
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    相关资源
    最近更新 更多