0

私はRailsを学んでおり、単体テストを勉強しています。私が使用している本の 1 つは、明らかに間違って書かれた例を示しています。

これは検証です:

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やその他の出力手法を使用して、いつでもプログラムの状態を確認できます。混乱している変数 status をダンプし、プログラムの出力を確認して、失敗の原因を特定できるかどうかを確認します。これはプログラムを書くときに便利で、試してみる価値があります。

ここでは、を呼び出した後、いつでもerrorsのフィールドを確認できます。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 に答える