【问题标题】:unit testing custom knockoutjs binding单元测试自定义knockoutjs绑定
【发布时间】: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 的第三个参数。

标签: unit-testing knockout.js


【解决方案1】:

您可以查看我的绑定集合以了解如何测试 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,我使用一个模拟函数,当您的自定义 bindnig 从淡出函数调用 value() 时,测试断言将触发

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

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

【讨论】:

  • 你能解释一下这对我的特殊情况有什么帮助吗?否则,您可以针对每个淘汰赛网络测试问题抛出此代码,它总是会有所帮助...
  • 两次调用 callback(); fadeOut 和 jquery 中的函数。但是那个 callback() 是在哪里定义的?我知道您将它作为函数参数传递,但它最初来自哪里?
  • 您在绑定中调用它们。
  • 在您的 ko.test 函数中,第三个参数是要测试的函数吗?这意味着什么。它的声明是这样的 function () { } 这似乎是一个空函数,那么这样做的目的是什么?
  • 我的点击绑定在视图模型中。我不明白你如何让这个绑定在单元测试中使用它?
猜你喜欢
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2012-12-02
  • 2015-07-27
  • 2018-12-24
  • 2018-02-25
  • 2015-01-11
  • 1970-01-01
相关资源
最近更新 更多