Rails集成测试实例变量方法不起作用?

时间:2013-12-20 16:52:38

标签: ruby-on-rails activerecord devise cucumber integration-testing

我正在研究一个带有设计和黄瓜的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工作,如何清理这些代码呢?

3 个答案:

答案 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将无法获取该属性。