如何访问Capybara使用的相同数据库数据

时间:2015-11-05 16:35:24

标签: ruby-on-rails rspec capybara capybara-webkit

我有一个非常简单的密码重置表单,它只是一个输入电子邮件和提交按钮的文本字段。

有一些使用JS的客户端验证,所以我在编写规范测试时使用Capyabara JS驱动程序。

此测试仅测试将密码重置令牌添加到用户的auth_info表中。

describe "password reset form", js: true do
  let(:email) { "foo@example.com" }

  # Create existing user with an email so we can reset it's password
  let!(:user) { create(:user, email: email) }

  before(:each) do
    fill_in email_field, with: email
    click_button reset_button
  end

  it "generates a new token" do
    # `token` is definitely getting set properly when I pause it here
    # with binding.pry and inspect the object using `user.reload`
    # But when running the test it always shows up as `nil`
    expect(user.reload.auth_info.token).to match(/[A-Fa-f0-9]{32}/)
  end
end

正如评论所指出的那样,我知道当我使用binding.pry直接检查令牌时,令牌已正确设置。但是,即使在使用nil刷新模型之后,RSpec和Capybara也将其视为reload

Capybara是否维持不同的缓存或其他东西?

谢谢!

编辑还尝试了将reload应用于User模型以及AuthInfo模型的不同组合,以防我需要刷新后者也是

1 个答案:

答案 0 :(得分:1)

您正在使用支持JS的浏览器,这意味着click_button是异步的。结果是您正在执行click_button,然后在按钮触发的操作发生之前立即检查令牌。您可以通过将sleep 5放在expect之前验证这一点,并且测试应该通过。在检查之前使测试等待的正确方法是使用capybaras匹配器在click_button完成后在页面上查找信息,如下所示

expect(page).to have_text('text that appears after click_button has succeeded')
expect(page).to have_selector('div.abcde') #element that appears after click_button has succeeded

这些将使测试等到操作完成,然后您可以检查令牌