使用Rspec

时间:2015-11-11 00:56:57

标签: ruby-on-rails rspec datepicker capybara

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

当用户编辑表单时,我希望他们能够看到他们之前选择的日期。 (例如,开始日期:2015年10月31日,结束日期:2015年11月15日)。

我正在尝试编写测试以确保我的应用可以执行此操作,但我仍然坚持使用语法。

user_updates_project_spec.rb

require "rails_helper"

feature "User updates project" do
   before (:each) do
      @user = create(:user)
      login_as(@user, scope: :user)
      @project = create(:project, creator: @user,
                  name: "Building a robot",
                  start_at: "2015-10-31",
                  end_at: "2015-11-15", )
   end

  scenario "and sees correct dates on form" do
     visit edit_user_project_path(@user, @project)

     expect(".datepicker").to have_content("October 31, 2015")
   end
end

我得到的错误是:

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>

关于它为什么不起作用的任何想法?

3 个答案:

答案 0 :(得分:0)

你写下你期望的方式,你真正说的是期待字符串&#34; .datepicker&#34;有内容&#34; 2015年10月31日&#34;这永远不会成真。 expect需要采用一个可以运行has_content匹配器而不是字符串的元素。你可以像这样重写它

expect(page.find(:css, '.datepicker.start-date')).to have_content("October 31, 2015")

虽然更好的方法可能是使用

expect(page).to have_css('.datepicker', text: 'October 31, 2015)

因为如果内容正在改变或通过ajax加载,那将匹配。 还有一点需要注意的是,既然你正在使用一个日期选择器小部件,你可能实际上需要查看JS在真实浏览器中生成的html,而不是查看tempalte中的html,以确定哪个你需要检查里面的内容。

答案 1 :(得分:0)

我想.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

答案 2 :(得分:0)

事实证明,在测试时我没有检查正确的元素。

解决了什么问题:

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

该datepicker集的元素ID是project_start_at和project_end_at。