在named_scope和rspec中使用类方法

时间:2015-08-07 09:12:56

标签: ruby-on-rails ruby rspec factory-bot

我可能把自己画成了一个角落。

在我的一些rails(2.3.18)named_scopes中,我使用类方法从数据库中检索已知行 - 例如状态值。

然而,当我尝试将这些与rspec一起使用时,我想我有一个问题,因为在应用程序加载之前没有加载灯具(我正在使用FactoryGirl) - 因此我在解析时遇到错误named_scopes(我认为)。

例如:

named_scope :active_users, :conditions => [ 'status_id = ?', UserStatus.Active.id ]

加载用户模型时会出现错误

app/models/user.rb:34: Called id for nil, which would mistakenly be 4

这是named_scope行。

user_status.rb
  def self.Active
    UserStatus.find_by_name('active')
  end

所以我想我有两个问题:

  1. 这是对named_scope的滥用吗?如果有的话,这会是一种更好的写作方式吗?

  2. 是否有可能让rspec在加载应用程序之前将一些关键数据加载到数据库中?

  3. 由于

3 个答案:

答案 0 :(得分:0)

你的指定范围写得很好。您需要检查UserStatus.Active.id的输出。它应该返回id数组。根据命名约定,如果您在UserStatus中编写了名为“Active”的方法,则它是错误的。它应该是小写的。

另外我不明白在=>中使用id UserStatus.Active.id。你能把这个方法放在这里吗?

答案 1 :(得分:0)

UserStatus.Active必须给你零 UserStatus.Active.id给出了这个错误。因为nil的id是4.确保你在Active方法中获得记录

答案 2 :(得分:0)

管理回答我自己的问题并将其放在这里以防其他人有同样的问题。

为了确保在解析named_scope时尝试访问数据库,我需要将:condition包装在lamdba / proc中,如下所示

named_scope :active_users, lambda {{ :conditions => [ 'status_id = ?', UserStatus.Active.id ] }}

现在允许加载应用程序,然后像往常一样在测试之前将测试所需的数据加载到数据库中。