2015-11-05 30 views
0

我有一个非常简单的密码重置表单,它只是一个输入电子邮件和提交按钮的文本字段。如何访问Capybara使用的相同DB数据

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

这个测试只是测试,一个密码重置令牌被添加到用户的auth_info表。

describe "password reset form", js: true do 
    let(:email) { "[email protected]" } 

    # 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设置。但RSpec和Capybara将其视为nil,即使在使用reload刷新模型之后。

是水豚维持不同的缓存还是什么?

谢谢!

编辑:还试图施加reloadUser模型的不同组合以及在AuthInfo模型,万一我需要刷新后者太

+0

取决于你在哪里窥探到你的代码,有同样的问题,因为我该在这一点上并没有现在 – jethroo

回答

1

你正在使用JS功能的浏览器,这意味着click_button是异步的。这样做的结果是你执行click_button,然后立即检查令牌已经发生由按钮触发的动作之前。您可以通过将sleep 5expect前验证这一点,测试应该通过。使测试等待前检查是利用水豚正确的方法匹配器来寻找改变一次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 

那些会使测试等待直到操作完成,然后你可以检查令牌

+0

完美犯了一个事务中调试,非常感谢! – user2490003

相关问题