2016-05-12 86 views
2

我一起具有与茉莉测试问题淘汰赛模板结合:如何测试Knockout.js点击茉莉

的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.logging的#clickme元素我可以看到它是存在的。

看来小部件中的点击绑定没有得到正确应用。但是,当我在bdd中运行测试并且结束并失败时 - 我可以手动单击此元素并确定调用了某些东西。

我在做什么错?正如我所说的,运行实际的应用程序是完美的。这似乎是茉莉花不能正确处理点击绑定 - 我没有这个问题与文档中设置的常规点击事件。已准备好

+0

我试图重现你的问题,但不能.. https://jsfiddle.net/9qb1936v/我错过了什么? – user3297291

+0

当整个事情在jasmine规范中运行时,出现问题,其中包含我的挖空小部件的固定装置(即HTML)被动态加载 –

回答

0

你真的不应该测试像这样的按钮点击 - 你可以如果您直接调用函数doSomething(),则更加确定。同样的方式,你不会自己测试任何JQuery的内部。

如果你真的想测试在一个固定的活动,你有没有尝试过

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

此外,仔细检查固定装置插入到DOM时调试测试中(通过浏览器说)

+0

我也尝试过 - 具有相同的结果。是的,夹具在那里。我想单击的元素的Console.log显示了这一点。唯一不存在的是通过淘汰赛添加的点击事件。我可以通过jquery添加其他人,他们会正常工作。 –

+0

关于直接测试函数 - 我们之前做过,并且导致测试没有捕获我们在重构过程中意外破坏的东西。这就是为什么我们宁愿测试点击本身的原因 –

+0

啊我明白了,我想那就是它的价值! :)我想这是由如何设置ko.applyBindings – kasperoo