我正在研究一个带有设计和黄瓜的RoR项目,我遇到了一个我不太了解的有趣问题。我正在编写集成测试(黄瓜步骤)来测试设计并确保我将来做的任何事情都不会破坏它,并且我发现了一些奇怪的行为:
在测试中,以下代码不起作用:
@user = FactoryGirl.create(:user)
@user.lock_access!
expect(@user.access_locked?).to be_true
它返回false。但是,这确实有效:
expect(User.find(@user.id).access_locked?).to be_true
因此,由于某种原因,实例变量没有正确的信息,但是当我从数据库中提取时,它是正确的。我猜这实际上是使用ActiveRecord的正确行为,但我并不完全理解为什么。
有人可以解释为什么会这样吗?如果有一种方法可用于使@user
工作,如何清理这些代码呢?
答案 0 :(得分:2)
另一个问题How can I know when to "refresh" my model object in Rails?可能会有所启发。
尝试:
expect(@user.reload.access_locked?).to be_true
答案 1 :(得分:1)
原因是@user
实例仍然引用内存中存在的对象,尽管数据库中的数据确实已经发生了变化。
要修复,请强制@user
重新加载
@user = FactoryGirl.create(:user)
@user.lock_access!
@user.reload
实际上find
的解决方案与reload
具有相同的效果。
答案 2 :(得分:0)
lock_access
通过编写locked_at
属性来工作,除非您重新加载,否则@user
将无法获取该属性。