【发布时间】:2013-05-27 13:05:35
【问题描述】:
当在我的触摸板上滑动元素时,我如何调用某个函数 'myValueAccessor' 来对这个 knockoutjs 绑定进行单元测试?
我也不确定该单元应该或能够在这里测试什么。
第一次断言是否调用了 myValueAccessor 是可以的。
但是我怎样才能触发/模仿或者我应该说mock...swiperight事件?
ko.bindingHandlers.tap = {
'init': function (element, valueAccessor) {
var value = valueAccessor();
var hammertime1 = Hammer(element).on("swiperight", function (event) {
$(element).fadeOut('fast', function () {
value();
});
});
}
};
self.myValueAccessor = function () {
location.href = 'set a new url'
};
更新
我已经在这里使用 mocha.js 进行了单元测试
我可以对绑定中的“value()”进行注释,但测试仍然成功,这很奇怪。
这样放是不是不正确(作为测试):
function (element,args) {
alert('assertion here');
}
作为 ko.test 函数的第三个参数?
ko.bindingHandlers.tap = {
'init': function (element, valueAccessor) {
var value = valueAccessor();
var hammertime1 = $(element).on("swiperight", function (event) {
$(element).fadeOut('fast', function () {
//value();
});
});
}
};
// Subscribe the swiperight event to the jquery on function
$.fn.on = function (event, callback) {
if (event === "swiperight") {
callback();
}
};
// Subscribe the fadeOut event to the jquery fadeOut function
$.fn.fadeOut = function (speed, callback) {
callback();
};
ko.test("div", {
tap: function () {
assert.ok(true, "It should call the accessor");
}
}, function () {
});
更新:
custom.bindings.js:
define(['knockout','hammer'], function (ko,Hammer) {
return function Bindings() {
ko.bindingHandlers.tap = {
'init': function (element, valueAccessor) {
var value = valueAccessor();
var hammertime1 = Hammer(element).on("swiperight", function (event) {
$(element).fadeOut('fast', function () {
value();
});
});
}
};
};
});
unittest.js:
如何将此代码连接到我的测试中的淘汰赛?
更新
绑定是通过我的 bindings.js 文件中的 require.js 注入的:
describe("When swiping left or right", function () {
it("then the accessor function should be called", function () {
ko.bindingHandlers.tap = new Bindings();
Hammer.Instance.prototype.on = function (event, callback) {
if (event === "swiperight") {
callback();
}
};
$.fn.fadeOut = function (speed, callback) {
callback();
};
var accessorCalled = false;
ko.test("div", {
tap: function () {
accessorCalled = true;
}
}, function () {
assert.ok(accessorCalled, "It should call the accessor");
});
});
});
bindings.js
define(['knockout','hammer'], function (ko,Hammer) {
return function () {
return {
'init': function (element, valueAccessor) {
var value = valueAccessor();
var hammertime1 = Hammer(element).on("swiperight", function (event) {
$(element).fadeOut('fast', function () {
value();
});
});
}
};
};
});
myviewmodel.js
...
ko.bindingHandlers.tap = new Bindings();
...
【问题讨论】:
-
当您想要断言 DOM 元素已通过绑定正确更新时,使用我的 ko.test 的第三个参数。