【问题标题】:How can I interpret this validation testing code?如何解释此验证测试代码?
【发布时间】:2014-01-16 22:41:47
【问题描述】:
class ProductTest < ActiveSupport::TestCase
  test "product attributes must not be empty" do
    product = Product.new
    assert product.invalid?
    assert product.errors[:title].any?
    assert product.errors[:description].any?
    assert product.errors[:price].any?
    assert product.errors[:image_url].any?
  end
end

大家好。我对 Ruby on Rails 还很陌生,我正在尝试创建一个简单的在线书店。我有一个需要测试的产品模型。我试图用“英语”理解这段代码,但我很困惑。所以,模型需要包含:title、:description、:price、:image_url 对吗?

我们是否只是想测试一下 Product 模型中是否存在所有这些属性?

谢谢大家。

【问题讨论】:

  • “我们只是想测试一下产品模型中是否存在所有这些属性吗?”是的,如果产品没有这些属性,您正在测试它是无效的,并且它应该包含由于这些属性的验证失败而导致的错误消息,但是我需要在 product = Product.new 之后有 product.save
  • 嗨,bjhaid。感谢你的快速回复。您能否澄清“product.save”部分?我想它还会测试保存的产品是否包含给定的属性?谢谢。
  • 触发验证

标签: ruby-on-rails ruby


【解决方案1】:

测试假定Product 模型已经进行了一些验证。

测试开始就行了

product = Product.new

您在哪里创建新产品。然后,您首先触发调用 invalid? 的验证,如果实例无效则返回 true 并填充 errors 列表。

product.invalid?

如果参数的结果为假,则之前的断言使测试失败。在这种情况下,参数是验证的结果。

assert(product.invalid?)

如果product.invalid? 将返回 false,则表示产品有效,这意味着验证没有发生,这不是您所期望的。

然后代码会检查每个预期会出现错误的属性,以查看是否设置了错误。

product.errors 包含错误列表,其中键是无效属性,值是数组,如果属性有效,则值为 nil。

assert product.errors[:description].any?

例如意味着您希望描述属性无效,实际上您检查是否存在至少一个错误集。


我个人不太喜欢该测试的方法,因为它部分不完整(您实际上并没有测试真正的验证,因此无法理解为什么特定属性无效),但这绝对是一个很好的起点简单的应用程序。

【讨论】:

  • 非常感谢您详细而精彩的回答 Simone!我现在明白了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2022-11-27
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多