5

当元素在我的触摸板上滑动时,我如何对这个 knockoutjs 绑定进行单元测试,我调用某个函数“myValueAccessor”?

我也不确定该单元应该或能够在这里测试什么。

第一次断言是否调用了 myValueAccessor 是可以的。

但是我怎样才能触发/模仿或者我应该说模拟......滑动事件?

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();
                    });
                });
            }
        };
    };
});

单元测试.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");
                });

            });
        });

绑定.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();

...
4

1 回答 1

5

您可以查看我的绑定集合以了解如何测试 https://github.com/AndersMalmgren/Knockout.Bindings/tree/master/test

这是我所有测试都使用的功能

ko.test = function (tag, binding, test) {
    var element = $("<" + tag + "/>");
    element.appendTo("body");
    ko.applyBindingsToNode(element[0], binding);
    var args = {
        clean: function () {
            element.remove();
        }
    };
    test(element, args);

    if (!args.async) {
        args.clean();
    }
};

编辑:对不起忘了嘲笑,你只是这样做

$.fn.on = function() {
}

我不知道你想在该代码中测试什么确切的逻辑,因为几乎没有,但是像这样 http://jsfiddle.net/Akqur/

编辑: 你可能对我在哪里连接你的绑定感到困惑吗?它在这里完成

{ 
   tap: function() {
      ok(true, "It should call the accessor");
   }
}

我告诉 ko 连接一个“tap”绑定,而不是连接到一个 observable 我使用一个模拟函数,当你的自定义 bindnigvalue()从淡出函数调用时,测试断言将触发

编辑: 也许这种方法对你更有意义? http://jsfiddle.net/Akqur/5/ 请注意,它仅在您的代码同步执行时才有效

编辑: 这里我使用 ko.test http://jsfiddle.net/Akqur/8/的第三个参数

于 2013-05-27T13:31:25.930 回答