我有一个非常简单的密码重置表单,它只是一个输入电子邮件和提交按钮的文本字段。
有一些使用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
模型的不同组合,以防我需要刷新后者也是
答案 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
这些将使测试等到操作完成,然后您可以检查令牌