gpt4 book ai didi

ruby-on-rails - 自定义验证器测试 - 包含错误?

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

在我的 Rails 项目中编写了一个自定义验证器,并希望编写一个测试何时将 nil 传递到记录中。

验证者代码

class FutureValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if value == nil
record.errors[attribute] << "can't be nil"
elsif value <= Time.now
record.errors[attribute] << (options[:message] || "can't be in the past!")
end
end
end

可能的测试

test "future validator rejects nil values" do
@obj.future = nil
assert_includes @obj.errors
end

我不仅想编写一个测试来检查 assert_not @obj.valid?,而且还想实际证明错误消息正在被传回。如果这要求太多,我会满足于知道错误消息返回但目前我的测试不工作。

它回来了

ArgumentError: wrong number of arguments (1 for 2..3)

更新接近绿色测试

  test "future validator rejects nil values" do
@obj.future = nil
@obj.valid?
assert_includes @obj.errors.messages, {future: ["can't be nil"]}
end

回来了

FutureValidatorTest#test_future_validator_rejects_nil_values [/Users/rwdonnard/WorkSpace/charter-pay-api/test/models/future_validator_test.rb:42]: Expected {:future=>["can't be nil"]} to include {:future=>["can't be nil"]}.

最佳答案

问题似乎出在您测试类的方式上,很可能是 assert_includes 引发了异常。 assert_includes 需要至少 2 个参数,第一个是集合,第二个是您希望包含的对象,在您的情况下分别是错误数组和您期望的错误。如果您不填充 @obj.errors 集合,您的测试也会失败,这需要调用 @obj.valid?

你的测试应该是这样的:

test "future validator rejects nil values" do
@obj.future = nil
@obj.valid?
assert_includes @obj.errors.messages, { future: ["can't be nil"] }
end

通过这种方式,如果 future.nil?,您可以确保您的模型无效,而不管其他验证是否到位。


我还建议您不要在自定义验证器中检查是否存在,因为 Rails 已经为此提供了一种方法。你可以让你的验证器看起来像这样:

class FutureValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
if value <= Time.now
record.errors[attribute] << (options[:message] || "can't be in the past!")
end
end
end

并像这样在您的模型中设置验证:

class SomeClass < ActiveRecord::Base
validates :future, presence: true, future: true
end

您还可以简化您的测试,例如:

test "is invalid with nil future date" do
@obj.future = nil
@obj.valid?
assert_includes @obj.errors.messages[:future], "can't be nil"
end

test "future validator rejects past dates" do
@obj.future = Date.new(1987, 1, 1)
@obj.valid?
assert_includes @obj.errors.messages[:future], "can't be in the past!"
end

关于ruby-on-rails - 自定义验证器测试 - 包含错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36698464/

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