如何使用Jasmine测试Knockout.js点击绑定

How to test the Knockout.js click binding with Jasmine

本文关键字:绑定 js Knockout 何使用 Jasmine 测试      更新时间:2023-09-26

我在茉莉花测试和敲除模板方面遇到了问题

html类似于此:

<body>
<my-widget params="value: $data></my-widget>
</body>

小部件有一个点击绑定:

<div class="my-widget">
   <a id="#clickme" data-bind="click: doSomething">Click me</a>
</div>

小部件javascript如下所示:

ko.components.register('my-widget', {
    viewModel : function(params) {
        this.doSomething = function() {
              // doing something
        };
    },
    template: {
        require: 'text!../../templates/my-widget.html'
    }
});

所有这些在生产中都能很好地工作,但在Jasmine/Jquery中,触发点击$("#clickme")不会执行doSomething。

以下是我的茉莉花测试摘录(它被大大简化了,但应该包含要点):

beforeEach(function (done) {
    require(['specHelpers', 'knockout'], 
        function (specHelpers, knockout) {
        specHelpers.loadFixtureIntoPage("page.html", "myPage"); // template and id to use
        expect($('#myPage')).toExist();
        done();
    });
});

it("WILL NOT TRIGGER MY CLICK", function (done) {
    ko.applyBindings(myPage.pageViewModel, $('#myPage'))[0]);
    setTimeout(function() { 
        $('#clickme').click();
        // doSomething is not called :(
        done();
    }, 300);
});

当console.log记录#clickme元素时,我可以看到它存在。

小部件中的点击绑定似乎没有得到正确应用。然而,当我在bdd中运行测试时,它已经结束并失败了——我可以手动单击这个元素,doSomething确实会被调用。

我做错了什么?正如我所说,运行实际的应用程序是完美的。jasmine似乎无法正确处理点击绑定-我对文档中设置的常规点击事件没有这个问题。ready

你真的不应该像那样测试按钮点击——如果你直接调用函数doSomething(),你可以更确定。与您自己不测试JQuery的任何内部一样。

如果你真的想在固定设备上测试事件,你试过吗

$("#clickme").trigger('click');

此外,在调试测试时(比如通过浏览器),请仔细检查fixture是否已插入到中的DOM中。