Ruby在“Rspec”中编写此规范的方式

时间:2014-04-16 10:23:29

标签: ruby ruby-on-rails-3 rspec rspec2 rspec-rails

我想知道是否有任何Ruby方式编写以下视图规范(不使用Capybara / Cucumber / Webrat助手。应该只是在rspec或rspec-rails中):

expect(rendered).to include("<input class='toggle_m' name='result_configuration[information]' type='checkbox' value='1'>")

expect(rendered).to include("<textarea class=details' disabled='disabled' name=result_configuration[info][]'></textarea>")

事情是,我需要查看是否选中了复选框(表示值为&#34; 1&#34;,值设置为&#34; 0&#34;当未选中时),则textarea应该被禁用有什么想法吗?

或者您如何以更易读的方式写出这种期望?建议是最受欢迎的。

感谢。

2 个答案:

答案 0 :(得分:1)

你可以尝试使用正则表达式,但我认为你的方法已经足够好了。

expect(rendered).should =~ /<input[^>]*name='result_configuration[information]'[^>]*value='1'[^>]*>/
expect(rendered).should =~ /<textarea[^>]*disabled='disabled'[^>]*name=result_configuration[info][][^>]*>

这种方法的局限在于,如果有任何已检查的复选框和任何禁用的textareas它将通过,为了做更多的事情,我肯定需要capybara或其他东西来实际解析html(regexes are not parsers

编辑:将name=部分添加到两个正则表达式中作为对评论的回复。这种方法的唯一优点是,如果你改变了元素的类,它就不会中断。不幸的是,除了外部宝石,我不知道更好的解决方案。

答案 1 :(得分:1)

为了测试和覆盖而编写这样的测试只会使继承代码库的人变得困难。我之前编写过这样的测试只是为了删除它们,因为对UI的更改更频繁,而且这样的测试会降低开发人员的速度。如果我仍然必须以OO方式编写它们,我会在pageobjects(这是一个宝石)的线条上设计它 - 在dom上包装类和几个通用辅助函数。使用Gemfile / bundler在测试组中添加新gem也不会影响生产服务器。