Javascript jasmine测试运行甚至在触发.click()之前

Javascript jasmine测试运行甚至在触发.click()之前,javascript,jquery,jasmine,jasmine-jquery,Javascript,Jquery,Jasmine,Jasmine Jquery,我只是在玩一个基本的ruby应用程序,它可以在单击按钮时更改html方向属性。它在JQuery端工作正常,但在我的测试用例中,即使.click()是触发器,它也会运行。这是我的档案 display.html.erb <p> <%= button_tag 'Convert', id: 'test', remote: 'true' %> </p> 问题是attr('dir')未定义,其值为'undefined',如果您明确地将标记属性设置为'rlt'或'ltr'

我只是在玩一个基本的ruby应用程序,它可以在单击按钮时更改html方向属性。它在JQuery端工作正常,但在我的测试用例中,即使.click()是触发器,它也会运行。这是我的档案

display.html.erb

<p>
<%= button_tag 'Convert', id: 'test', remote: 'true' %>
</p>
问题是attr('dir')未定义,其值为'undefined',如果您明确地将标记属性设置为'rlt'或'ltr',它将具有您设置的字符串值


$style.attr('dir',$style.attr('dir')=='rtl'和&typeof$style.attr('dir')!=='undefined'?'ltr':'rtl');


未定义的

我刚刚尝试了您的代码,并通过以下简单的修改使其正常工作(除了为jasmine jquery rails gem实现一个快速解决方案以加载装置):

改为

setHtmlStyle();
这使测试工作正常

Jasmine是一个针对低级JavaScript代码的单元测试工具,在执行过程中DOM元素从视图中隐藏。因此,使用jQuery执行
click()
没有效果

这意味着与Selenium或Capybara不同,Jasmine的目标是帮助开发人员测试/测试驱动低级JavaScript逻辑单元,如计算和一些轻量级DOM操作

最快的收获是针对低级JavaScript方法编写测试,这些方法完成了用户交互的工作,但不针对涉及click()之类的方法。这有助于您在测试小功能时有一个快速的反馈循环。换句话说,它关注的是“In”阶段的外部-内部BDD测试

必须使用Selenium、Capybara和Cucumber等工具通过集成测试(完整的前端到后端的端到端测试)来解决“退出”阶段

我希望这对你有帮助。如果你有更多的问题,请在评论中告诉我

下面是关于该主题的一个很好的后续演示,它打破了端到端集成和以查看JavaScript为中心的测试之间的差异:


尽管如此,我还是强烈建议与BDD外部的一位经验丰富的开发人员交谈,了解如何将流程分解为端到端集成测试(Cucumber)、浏览器JavaScript单元测试(Jasmine)和低级后端单元测试(例如RSpec)。

为了确保.click()函数正常工作,我更改了代码

$(document).ready(function(){
  $(document).on('click', '#test', setHtmlStyle);
});

var setHtmlStyle = function(){
  var $style = $('html');
  $style.attr('dir', $style.attr('dir') === 'rtl' ? 'ltr' : 'rtl');
};

输入的
id='rtl'
应该是
id='test'
对吗?是的,为我的问题编辑了它。谢谢。我不太了解茉莉花。但是你试过做“异步预期”吗?我刚开始和jasmine合作。我不确定
async expect
会做什么。你能详细说明一下吗?在公认的答案中有一个例子,它仍然不能解决我的问题。我更改了脚本并运行了测试,但仍然显示相同的错误消息。
$(document).ready(function(){
  $(document).on('click', '#test', setHtmlStyle);
});

var setHtmlStyle = function(){
  var $style = $('html');
  $style.attr('dir', $style.attr('dir') === 'rtl' ? 'ltr' : 'rtl');
};