1

私は新しく、Rails を使用したアジャイル Web 開発、第 4 版(Rails 3.2 用) という本を使用して Rails を学習しようとしています。これまでのところ、問題なくすべての章を完了することができました。エラーがあった場合、それはたいてい私のずさんなコード (カンマの忘れ、'end' ステートメントなど) でした。しかし、モデルの単体テストに関する章で問題が発生しました。画像の URL が .gif、.jpg、または .png のいずれかで終わることを検証している部分。

depot/test/product_test.rb ファイルの本からコードをそのままコピーしました。

test "image url" do
ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg http://a.b.c/x/y/z/fred.gif }
bad = %w{ fred.doc fred.gif/more fred.gif.more }

ok.each do |name|
    assert new_product(name).valid?, "#{name} shouldn't be invalid"
end
bad.each do |name|
    assert new_product(name).invalid?, "#{name} shouldn't be valid"
end

しかし、rake test:unitsコマンドを実行すると、次のエラーが発生します...

1) Failure:
test_image_url(ProductTest)[../depot/test/unit/product_test.rb:46]:
fred.gif shouldn't be invalid

4 tests, 13 assertions, 1 failures, 0 errors, 0 skips
rake aborted!

これは、テストしている画像の URL が無効であることを意味しますか? 「fred.gif が無効であってはならない」という内容が正しいのに、テストが失敗するのはなぜですか?

私がそこに持っている他のテスト(例えば、「製品属性が空であってはならない」、「製品価格が正でなければならない」など)がうまく動作するので、テストのこの部分が間違っているに違いないと確信しています。 . 「テスト画像の URL」コード ブロックを取り出しても、エラーは発生しません。

私が間違っていることを教えてください。ProductTest の全体を投稿する必要がある場合は、投稿できます。


更新: Products モデルにタイプミスがあり、テストが失敗しました。すべて修正されました。

4

4 に答える 4

3

同じ問題があり、new_product の定義を変更する必要がありました。私の最初の定義では、「画像の URL」を引用符で囲みました。引用符を削除したら、大丈夫でした。コードは次のとおりです (私の最初の間違いは、コードの 5 行目にありました)。

def new_product(image_url)
  Product.new(title:       "My Book Title",
               description: "yyy",
               price:       1,
               image_url:   image_url)
end

test "image url" do
  ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg
         http://a.b.c/x/y/z/fred.gif }
  bad = %w{ fred.doc fred.gif/more fred.gif.more }

  ok.each do |name|
    assert new_product(name).valid?, "#{name} shouldn't be invalid"
  end

  bad.each do |name|
    assert new_product(name).invalid?, "#{name} shouldn't be valid"
  end
end

ご覧のとおり、テスト名に「_」を使用しなかったため、テストは成功しました。

于 2013-01-07T19:33:29.410 に答える
0

アンダースコアが欠落しているようです_

「画像のURL」をテストします

する必要があります

「image_url」をテストします

あなたはここで私のファイルから段落をすることができます:

test "image_url" do
ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg   http://a.b.c/x/y/z.gif}
bad = %w{ fred.doc fred.gif/more fred.gif.more }
ok.each do |name|
    assert new_product(name).valid?, "#{name} shouldn't be invalid"
end
bad.each do |name|
    assert new_product(name).invalid?, "#{name} shouldn't be valid"
end
于 2012-09-15T20:33:10.533 に答える
0

問題は関数「new_product」の定義にあると思います。関数がすべてのフィールドを有効なデータに設定していることを確認してください。私は説明を有効な値に設定していませんでした。これが役立つことを願っています。おそらく、この解決策は既に見つけていましたが、投稿を更新していませんでした。

私が言っているのは、他の分野が原因で製品が失敗しているということです。失敗しているテストは、各 image_url で構築された製品にエラーがないことを確認することです。コンストラクター関数 new_product が有効な製品を構築できることを確認する必要があるだけです。

于 2012-05-31T18:57:15.577 に答える
0

私はこれに苦労していました。また型式に誤りがありました。私の検証で。を でグループ化し\Zましたpng。キャプチャ グループの外にある必要があります。

違う:

class Product < ApplicationRecord
  validates :title, :description, :image_url, presence: true
  validates :price, numericality: { greater_than_or_equal_to: 0.01 }
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
    with: %r{\.(gif|jpg|png\Z)}i, # <<<<<----
    message: 'must be a URL for GIF, JPG, or PNG image.'
  }
end

右:

class Product < ApplicationRecord
  validates :title, :description, :image_url, presence: true
  validates :price, numericality: { greater_than_or_equal_to: 0.01 }
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
    with: %r{\.(gif|jpg|png)\Z}i, # <<<<<----
    message: 'must be a URL for GIF, JPG, or PNG image.'
  }
end
于 2016-11-17T17:56:22.373 に答える