我在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
如何选中此框?
答案 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