使用水豚和简单形式进行测试不会选中复选框

时间:2014-11-09 15:15:14

标签: ruby-on-rails rspec capybara simple-form

我在capybara / rspec测试中从simple_form检查服务条款框时遇到了一些麻烦。
这是我的验证:

validates :terms_of_service, acceptance: true, allow_nil: false

如果我删除了allow_nil:false,那么即使没有选中该框,规格也会全部通过。如果我离开它,验证会导致规格失败。

以下是创建表单/复选框的代码:

  = f.label :terms_of_service, "I agree to the #{link_to 'Terms of Service', terms_of_service_path, :target => "_blank"}".html_safe
  = f.check_box :terms_of_service

生成的html:

<label for="candidate_terms_of_service">I agree to the <a href="/terms_of_service" target="_blank">Terms of Service</a></label>
<input name="candidate[terms_of_service]" type="hidden" value="0">
<input id="candidate_terms_of_service" name="candidate[terms_of_service]" type="checkbox" value="1">

我在测试中的尝试,我已经单独尝试过:

  page.find_by_id("candidate_terms_of_service").check
  find(:xpath, "//*[@id='candidate_terms_of_service']").set(true)
  find(:css, "#candidate_terms_of_service").set(true)
  check 'candidate[terms_of_service]'
  check 'I agree to the Terms of Service'
  find('#candidate_terms_of_service').check

导致失败:

  Failure/Error: let(:candidate) { create(:candidate) }
 ActiveRecord::RecordInvalid:
   Validation failed: Terms of service must be accepted

如何选中此框?

2 个答案:

答案 0 :(得分:1)

这个特殊的simple_form字段使我感到非常悲伤,尽管我发现提到了几种查询和设置它的方式,但没有一种起作用(有些提到in this issue,有些来自Capybara issues)。

我发现以下内容实际上可以与带有RSpec的simple_form布尔值一起使用:

find(:xpath, "//label[@for='candidate_terms_of_service']").click

为完整起见,考虑到不同的Web驱动程序和给出的整体解决方案,以下是找到的其他解决方案,但会导致无效的选择器错误。输入选择器实际上会因无法检查simple_form的默认隐藏输入而出错;此错误是有道理的,标签是可见的最顶层元素。

find('#active_form_terms_of_service').set(true)

# or select by label

find('label[for=active_form[terms_of_service]').click

# and select by label and value if multiple boxes 
# with the same ID (not sure why this would happen)

find("label[value='1']").click

# or select the input with xpath

find(:xpath, "//input[value='1']").set(true)

答案 1 :(得分:0)

尝试:

find('#candidate_terms_of_service').check