我是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");
});
});
但点击事件似乎从未被源代码拾取。
我做错了什么?
提前致谢
答案 0 :(得分:2)
jquery的trigger
方法既不在浏览器上创建真实事件,也不调用使用核心js方法注册的事件处理程序,如addEventListener
!
github上有一个项目,当测试涉及本机浏览器事件时,jquery团队使用该项目,这里是插件:https://github.com/eduardolundgren/jquery-simulate
这个想法是一个真实的事件最终会在它开始流动时调用一个jquery处理程序,并且奖励是即使其他类型的处理程序在没有jquery的情况下注册也会响应。
答案 1 :(得分:0)
问题是由查询触发的事件默认情况下没有目标对象。试试这个:
var click = jQuery.Event("click", { target: $('<div class="">test</div>') });