如何正确测试页面上的一个对象

时间:2017-01-03 08:05:58

标签: ruby-on-rails rspec capybara

我正在使用帖子和喜欢创建rails应用程序。

feature "Create like" do
  include_context "user signed in"

  def have_updated_likes_count
    new_likes_count = bonus.likes_count
    have_content("Likes #{new_likes_count}")
  end

  let!(:bonus) { create(:bonus) }
  let(:decorated_bonus) { bonus.decorate }

  before { visit root_path }

  scenario "User likes bonus", js: true do
    find(".like").click

    expect(bonus).to have_updated_likes_count
    expect(page).to have_content(current_user.full_name)
  end
end

奖金=发布。正如你在这里看到的,我检查用户是否喜欢奖金。但是在这个root_path(主页)中我有很多帖子(20),每个帖子都喜欢。我的测试尝试检查expect(bonuses).to have_updated_likes_countexpect(page).to have_content(current_user.full_name)并且它始终都是正确的,因为它检查整页,但我只需要检查一个帖子(我在哪里find(".like").click)。我怎样才能解决我的问题?

1 个答案:

答案 0 :(得分:0)

这取决于您的网页结构,但通常您希望使用within将操作范围限定为特定元素。

page.within('selector that finds the post element') do
  find(".like").click
  expect(bonus).to have_updated_likes_content   # issues
  expect(page).to have_content(current_user.full_name) # issues
end

这回答了你的问题,但是测试的其余部分也有一些你需要解决的问题。

  1. 一旦你点击.like元素,奖励对象就会异步更新,所以试图立即访问它会变得很脆弱,你应该在检查之前检查页面上的其他视觉变化。
  2. 您没有从数据库重新加载奖励对象,因此它可能仍具有相同的值