gpt4 book ai didi

ruby-on-rails - 使用自定义验证器时 RSpec 失败

转载 作者:数据小太阳 更新时间:2023-10-29 08:28:49 25 4
gpt4 key购买 nike

我在我的 Rails 3.1 项目中使用了这种验证。

validates_presence_of :sales_price
validates_presence_of :retail_price
validates_numericality_of :sales_price, :greater_than => 0,
:allow_blank => true
validates_numericality_of :retail_price, :greater_than => 0,
:allow_blank => true

validate :sales_price_less_than_retail

def sales_price_less_than_retail
if sales_price >= retail_price
errors.add(:sales_price, "must be less than retail price.")
end
end

我正在使用 rspec 测试模型。当我只使用 Rails 标准验证助手时一切正常。但是当我编写自定义验证器(sales_price_less_than_retail)时,测试开始失败。

测试代码如下:

it { should validate_presence_of :sales_price }
it { should validate_presence_of :retail_price }
it { should validate_numericality_of :sales_price }
it { should validate_numericality_of :retail_price }

这是工厂:

Factory.define :offer_option do |f|
f.sales_price rand(21) + 10 # $10-$30
f.retail_price { |a| a.sales_price * 2 }
end

当我运行测试时出现这样的错误:

失败:

1) 报价选项

Failure/Error: it { should validate_presence_of :sales_price }
NoMethodError:
undefined method `>=' for nil:NilClass
# ./app/models/offer_option.rb:38:in `sales_price_less_than_retail'
# ./spec/models/offer_option_spec.rb:18:in `block (2 levels) in <top (required)>'

2) 报价选项

 Failure/Error: it { should validate_presence_of :retail_price }
ArgumentError:
comparison of BigDecimal with nil failed
# ./app/models/offer_option.rb:38:in `>='
# ./app/models/offer_option.rb:38:in `sales_price_less_than_retail'
# ./spec/models/offer_option_spec.rb:19:in `block (2 levels) in <top (required)>'

我想一切都应该没问题,因为 rspec 应该单独测试验证器,但它似乎在我的测试中调用 validates_presence_of 之后调用了自定义验证器。当我删除自定义验证器时,问题消失了。

我做错了什么?

最佳答案

我假设这是因为 validate_presence_of rspec helper set offer_option.sales_price = nil 然后调用 valid?在 offer_option 上。当调用 valid? 时,它会运行你所有的验证,所以你的自定义验证也是如此。然后你会得到这个错误,因为 nil 上没有 '>=' 方法。

如果您将 sales_price_less_than_retail 更改为:

def sales_price_less_than_retail
return if sales_prices.blank? || retail_price.blank?

if sales_price >= retail_price
errors.add(:sales_price, "must be less than retail price.")
end
end

那么它应该可以工作了。

关于ruby-on-rails - 使用自定义验证器时 RSpec 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8120433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com