0

我正在学习 Rails,并且正在学习单元测试。我正在使用的其中一本书给出了一个显然写错的例子。

这是验证:

class Product < ActiveRecord::Base
  attr_accessible :description, :image_url, :price, :title

  #VALIDATION PROCESS

  validates :title, :description, :image_url, :presence => true, :length => {:minimum => 10}
  validates :price, :numericality => {:greater_than_or_equal_to => 0.01}
  validates :title, :uniqueness => true
  validates  :image_url, :format => {
    :with => %r{\.(gif|jpg|png)$}i,
    :message => 'Must be a URL for GIF,PNG or JPG image!'
  }
end

这是测试:

require 'test_helper'

class ProductTest < ActiveSupport::TestCase

  test "product price must be positive" do

  product = Product.new(:title => "My Book Title" ,
  :description => "yyy" ,
  :image_url => "zzz.jpg" )

  product.price= -1
  assert product.invalid?
  assert_equal "must be greater than or equal to 0.01" ,
  product.errors[:price].join('; ' )

  product.price = 0
  assert product.invalid?
  assert_equal "must be greater than or equal to 0.01" ,
  product.errors[:price].join('; ' )

  product.price = 1
  assert product.valid?

  end

end

当我在命令行上使用 运行测试时rake test:units,最后一个断言失败:

product.price = 1
assert product.valid?

它说Failured assertion, no message given

奇怪的是,这本书本身就说这个特定的断言是正确的,所以在测试期间应该什么都不会发生。

那么,这是怎么回事?代码是错误的,还是我做错了什么,或者是正确的,我只是感到困惑?

4

1 回答 1

0

您已添加验证器

validates :title, :description, :image_url, :presence => true, :length => {:minimum => 10}

这要求:title:description:image_url字段至少有 10 个字符。但是,您创建了一个带有:description => 'yyy',的产品:image_url => "zzz.jpg",这应该是验证失败的原因。

Kernel#p而且,您始终可以使用Kernel#puts或其他输出技术检查程序状态。把你困惑的变量状态转储出来,检查程序输出,看看能不能找出失败的原因。这在编写程序时很有用,值得一试。

在这里,您可以随时查看after callerrors的字段。productproduct.valid?

# change
product.price = 1
assert product.valid?

# to 
product.price = 1
puts ">>>>>>>>>>>>>>>>>>>>>>>>DUMP"
puts product.valid?
p product.errors
于 2013-06-18T03:42:16.970 回答