【发布时间】:2015-10-31 22:31:38
【问题描述】:
在自学 Ruby 和 Rails 时,我目前正在构建一个基于 Hartl tutorial 的用户系统;此时的主要区别是我使用 Rspec/Capybara 而不是 TestUnit 对其进行测试。到目前为止,大多数事情都相当简单,但我在测试密码重置时一直被困在这个问题上。
当我手动测试密码重置时,它们完全按预期工作。因此,我很确定问题出在 Rspec、Capybara 和 FactoryGirl 之间。
一直失败的规范代码是当我想访问忘记密码的链接时:
# password_resets_spec.rb
visit(edit_password_reset_path(spec_user.reset_token, email: spec_user.email))
它给了我:
ActionController::UrlGenerationError: 没有路由匹配 {:action=>"edit", :controller=>"password_resets", :email=>"john2@example.com", :format=>nil, :id=>nil} 缺少必需的键:[:id]
密码重置是(部分)资源,其 id 是用户的reset_token。
spec_user 由 FactoryGirl 生成:
#password_resets_spec.rb
let(:spec_user){ FactoryGirl.create :user }
相关的:user 工厂没有设置reset_token,但是当我尝试使用它时,重置表单没有正确设置令牌,并且与生成的摘要不匹配。这是设置两者的代码:
# user.rb
def create_reset_digest
self.reset_token = User.new_token
update_attribute(:reset_digest, User.digest(reset_token))
update_attribute(:reset_sent_at, Time.zone.now)
end
我可以通过使用设置reset_token的工厂绕过上述错误,但是用于路由的令牌与保存的摘要不匹配,并且测试的下一步失败。
到目前为止,我的结论是我对如何处理虚拟属性有误解,因为令牌是虚拟的,而摘要保存到数据库中。我怀疑我在规范中为我的路线获得的reset_token 与生成摘要所涉及的不是同一个,不知何故。
任何帮助理解这里发生的事情将不胜感激! :)
【问题讨论】:
标签: ruby-on-rails testing rspec factory-bot