我如何使单元测试工作,如我的书中所示



我正在学习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?之后检查producterrors字段。

# change
product.price = 1
assert product.valid?
# to 
product.price = 1
puts ">>>>>>>>>>>>>>>>>>>>>>>>DUMP"
puts product.valid?
p product.errors

最新更新