Ruby on rails 用Rspec测试数据选择器gem

Ruby on rails 用Rspec测试数据选择器gem,ruby-on-rails,rspec,datepicker,capybara,Ruby On Rails,Rspec,Datepicker,Capybara,我正在为我的应用程序使用bootstrap datepicker rails gem,并创建了一个表单,用户可以在其中选择开始日期和结束日期 当用户编辑表单时,我希望他们能够看到以前选择的日期。e、 g.开始日期:2015年10月31日,结束日期:2015年11月15日 我正试图编写一个测试来确保我的应用程序能做到这一点,但我在语法上遇到了麻烦 用户\u更新\u项目\u spec.rb 我得到的错误是: Failure/Error: expect(".datepicker").to have_c

我正在为我的应用程序使用bootstrap datepicker rails gem,并创建了一个表单,用户可以在其中选择开始日期和结束日期

当用户编辑表单时,我希望他们能够看到以前选择的日期。e、 g.开始日期:2015年10月31日,结束日期:2015年11月15日

我正试图编写一个测试来确保我的应用程序能做到这一点,但我在语法上遇到了麻烦

用户\u更新\u项目\u spec.rb

我得到的错误是:

Failure/Error: expect(".datepicker").to have_content("October 31, 2015")
  expected to find text "October 31, 2015" in ".datepicker"
这是我的表单的外观:

<div class="col-sm-6 pl0">
   <%= f.input :start_at, label: "Start Date", as: :string,
                  input_html: {value:@project.set_start_date_for_form.to_s(:long),
                  class: "datepicker start-date"} %>
</div>
<div class="col-sm-6 pr0">
   <%= f.input :end_at, label: "End Date", as: :string,
                  input_html: {value: @project.set_end_date_for_form.to_s(:long),
                  class: "datepicker end-date"} %>
</div>

你知道为什么它不起作用吗

按照您编写expects的方式,您真正要说的是希望string.datepicker的内容在2015年10月31日出现,这永远不会成为现实。expect需要获取have_内容匹配器可以运行的元素,而不是字符串。你可以这样重写

expect(page.find(:css, '.datepicker.start-date')).to have_content("October 31, 2015")
虽然更好的方法可能是使用

expect(page).to have_css('.datepicker', text: 'October 31, 2015)
因为如果内容正在更改或正在通过ajax加载,这将匹配。
另一件需要注意的事情是,由于您使用的是datepicker小部件,您实际上可能需要查看真实浏览器中JS生成的html,而不是视图tempalte中的html,要准确确定需要检查其中内容的元素。

我想可能会混淆.start date和.end date。您还可以使用.text属性检查它们:

expect(page.find(:css, '.datepicker.start-date').text).to eq('October 31, 2015')
expect(page.find(:css, '.datepicker.end-date').text).to eq('November 15, 2015')
如果失败,您可以打印值以进行调试:

puts page.find(:css, '.datepicker.start-date').text

测试时,我没有检查正确的元素

解决问题的办法是:

expect(page).to have_css("#project_start_at[value='October 31, 2015']")
expect(page).to have_css("#project_end_at[value='November 15, 2015']")

日期选择器设置的元素id是project\u start\u at和project\u end\u at。

它几乎可以工作了。现在我得到了以下错误:用户更新项目并在表单上看到正确的日期失败/错误:expectpage.find:css,'.datepicker.start date'.text.to eq'2015年10月31日'expected:2015年10月31日get:compared using==似乎没有检测到输入值。当我真正进入编辑页面时,一切正常。我无法测试它。你是对的,我没有检查正确的元素。最终奏效的是:expectpage.to'u cssproject_start_于[value='2015年10月31日']expectpage.to'u cssproject_end_于[value='2015年11月15日']好的-由于您正在检查这两个元素的值属性,我将假设它们是某种类型的输入字段-在这种情况下,您也可以使用expectpage.to让_字段“project_start_at”带有:“Octory 31,2015”,这提供了更好的阅读和一些其他功能
expect(page).to have_css("#project_start_at[value='October 31, 2015']")
expect(page).to have_css("#project_end_at[value='November 15, 2015']")