我正在学习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
。
奇怪的是,这本书本身说这个特定的断言是正确的,所以在测试期间不应该发生任何事情。
那么,那是什么呢?代码是错误的,还是我做错了什么,或者是对的,我只是感到困惑?
答案 0 :(得分: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
或其他输出技术检查计划状态。将变量状态转储到您感到困惑的位置,检查程序输出并查看是否可以找出失败原因。这在编写程序时很有用,值得尝试。
此处,您可以在致电errors
后始终查看product
的{{1}}字段。
product.valid?