【问题标题】:Rspec doesn't reload changed password attribute - why?Rspec 不会重新加载更改的密码属性 - 为什么?
【发布时间】:2012-05-16 21:15:17
【问题描述】:

我正在运行 Rails 3.2.1 和 rails-rspec 2.8.1....当我运行重置用户密码的测试时,似乎重新加载用户对象不会加载新密码属性... .

这是我的测试代码:

 describe "Reset password page" do
    let(:teacher) { FactoryGirl.create(:teacher, :email=>"jane@gmail.com")}
    let(:old_password) { teacher.password }
    before do
      visit reset_password_form_path
      fill_in "Email", with: teacher.email
      click_button "Reset Password"
    end
    it { should have_content('Your new password has been emailed to the address you provided.')}
    specify { Teacher.find_by_email("jane@gmail.com").password.should_not == old_password }
    ## specify { teacher.reload.password.should_not == old_password }  ##THIS FAILS
  end

指定 { teacher.reload.password.should_not == old_password } 失败,但 指定 { Teacher.find_by_email("jane@gmail.com").password.should_not == old_password } 通过

所以这告诉我密码被正确保存,但没有被重新加载......任何想法为什么?我正在使用 Rails 3.2.x“has_secure_password”方法来滚动登录/密码功能。这意味着密码摘要是保存到数据库中的内容,密码是虚拟属性(我认为)。

【问题讨论】:

  • 我在reload 中遇到了同样的问题,在should 中不起作用:stackoverflow.com/questions/10504505/…
  • 在您的示例中,重新加载效果很好,您应该只使用 should_not
  • @Samy Dindane,我对您在10504505 的回答感到困惑,因为我的指定{teacher.reload...} 行不等同于 sn-p.reload.title.should == “再见”??
  • 对不起,伙计。当我发布第一个评论时,我有点困惑。请不要介意。 :)
  • @apneadiving,对不起,有一个错字 - “should_not” .reload 行失败,这就是我如此困惑的原因;我已经更正了原帖中的错字

标签: ruby-on-rails rspec2


【解决方案1】:

刚刚明白:let 块在你召唤它们之前不会加载。

所以,因为您之前没有在任何地方使用过old_password

teacher.reload.password.should_not == old_password

相当于:

teacher.reload.password.should_not == teacher.reload.password

这就是它不能失败的原因!

如果您希望它正确失败

old_password #because it's triggered, the value is set and won't be set again
teacher.reload.password.should_not == old_password

编辑:

describe "Reset password page" do
  let(:teacher) { FactoryGirl.create(:teacher, :email=>"jane@gmail.com")}

  before do
    @old_password = teacher.password
    visit reset_password_form_path
    fill_in "Email", with: teacher.email
    click_button "Reset Password"
  end

  specify { teacher.reload.password.should_not == @old_password }
end

【讨论】:

  • 所以这里是重写测试的一部分:let(:teacher) { FactoryGirl.create(:teacher, :email=>"jane@gmail.com", :password=>"foobar",:password_confirmation=>"foobar")} let(:old_password) { "foobar" } before do old_password...指定{teacher.reload...} 即使我在前块中调用 old_password 仍然失败...此时,我'我认为这可能是因为“密码”是教师模型的虚拟属性(密码摘要是实际保存到数据库中的内容)并且不知何故导致它只是重新加载 FactoryGirl 原始密码。
  • 不使用实例变量,您可以使用let!(:old_password) { ... } 立即执行 let 而不是延迟执行(注意感叹号)。
  • @RobDavis:好话。在这种情况下使用 let 似乎仍然很奇怪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多