我正在学习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
奇怪的是,这本书本身说这个特定的断言是正确的,所以在测试过程中不应该发生任何事情。
那是怎么回事?是代码错了,还是我做错了什么,还是它是对的,我只是困惑了?
您已经添加了一个验证器
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
或其他输出技术检查程序状态。转储您感到困惑的变量状态,检查程序输出,看看是否可以找到失败的原因。这在编写程序时很有用,值得一试。
在这里,你总是可以在调用product.valid?
之后检查product
的errors
字段。
# change
product.price = 1
assert product.valid?
# to
product.price = 1
puts ">>>>>>>>>>>>>>>>>>>>>>>>DUMP"
puts product.valid?
p product.errors