【问题标题】:Custom Method in Rails ValidationRails 验证中的自定义方法
【发布时间】:2012-03-15 00:40:19
【问题描述】:

tl;dr 验证在浏览器中有效,但使用 rspec 失败。我不知道为什么。

回答:我试图批量分配 user_id,但 user_id 不可批量分配。在控制器中正确构建它,在 rspec 中不正确。

这是我的列表模型。每个列表都有一个价格和一个与之关联的 user_id。

在我的“listing”模型中,我有“price”。

在我的“用户”模型中,我有一个名为“vip”的布尔属性。

“价格”的最大值取决于用户的 VIP 状态。如果是VIP,最高价格为400。否则,最高价格为200。

我编写了一个方法“listing_ceiling”,它应该根据用户的 VIP 等级返回正确的最大值。

它可以在浏览器中运行,但是当我运行测试时,rspec 返回错误:

undefined method `vip?' for nil:NilClass

我不确定我在哪里做不到。它在浏览器中正常工作,但在使用 rspec 测试时失败。代码如下:

validates_numericality_of :price, :presence => true, :greater_than => 10, :less_than => :listing_ceiling

def listing_ceiling
    if self.user.vip?
        400.01
    else
        200.01
    end
end

任何想法为什么会以这种方式失败?

【问题讨论】:

  • 当 rspec 运行时,它使用一个测试数据库。你确定那里有用户吗?

标签: ruby-on-rails rspec


【解决方案1】:

Listing#user 返回nil。可能有两个问题。

  1. 您的列表没有用户。即外键user_idnil 用于有问题的Listing。或
  2. 您的列表user_id 列中有一个值。但是没有具有该 ID 的 User

解决方案是将用户分配给您的列表。

【讨论】:

  • 关闭。我是手动分配 user_id,但 user_id 不能批量分配。因此,没有用户!
【解决方案2】:

您应该检查您的 RSpec,问题不在于您的自定义验证方法,而在于您的测试设置。正如错误消息所述 user == nil!

【讨论】:

  • 宾果游戏。模型中的方法是正确的,所以当然可以在浏览器中使用。正如你所说,问题出在rspec中。我试图手动分配 user_id,但它不能批量分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多