【问题标题】:Rails integration test instance variable methods not working?Rails 集成测试实例变量方法不起作用?
【发布时间】:2013-12-20 16:52:37
【问题描述】:

我正在使用 devise 和 cucumber 进行一个 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 工作,如何稍微清理一下这段代码?

【问题讨论】:

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


    【解决方案1】:

    另一个问题How can I know when to "refresh" my model object in Rails? 可能会有所启发。

    试试:

    expect(@user.reload.access_locked?).to be_true
    

    【讨论】:

      【解决方案2】:

      原因是@user 实例仍然指向内存中存在的对象,尽管数据库中的数据确实发生了变化。

      要修复,请强制 @user 重新加载

      @user = FactoryGirl.create(:user)
      @user.lock_access!
      @user.reload
      

      其实你find的解决方案和reload的效果是一样的。

      【讨论】:

        【解决方案3】:

        lock_access 通过写入locked_at 属性来工作,除非您重新加载,否则@user 不会获取该属性。

        【讨论】:

          猜你喜欢
          • 2013-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多