Почему мой тестовый модуль image_url не проходит? (из учебника Agile Web Development с Rails 'Depot')
Я новичок и пытаюсь изучать Rails, используя книгу Agile Web Development с Rails, четвертое издание (для Rails 3.2). До сих пор был в состоянии пройти через все главы без икоты. Если были ошибки, обычно это был мой неаккуратный код (забыв запятую, оператор '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 не должен быть недействительным"?
Я вполне уверен, что именно эта часть теста должна быть неверной, потому что другие тесты, которые я там выполняю (например, "атрибуты продукта не должны быть пустыми", "цена продукта должна быть положительной" и т. Д.), Работают нормально., Я не получаю никаких сбоев, если вынимаю блок кода "test image url".
Пожалуйста, дайте мне знать, что я делаю не так. Если вам нужно, чтобы я опубликовал весь ProductTest, я могу.
ОБНОВЛЕНИЕ: в моей модели продуктов была опечатка, из-за которой тест не прошел. Все исправлено сейчас.
4 ответа
У меня была такая же проблема, и мне пришлось изменить свое определение для new_product. В моем первоначальном определении у меня были кавычки вокруг "URL изображения". Как только я удалил цитаты, я был в порядке. Вот код (моя первоначальная ошибка была в пятой строке моего кода):
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
Как видите, я не использовал '_' в названии теста, и мои тесты пройдены.
Я просто боролся с этим. Была также опечатка в модели. С моими утверждениями. Я сгруппировал \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
Я считаю, что проблема в определении для функции 'new_product'. Убедитесь, что функция устанавливает все поля на допустимые данные. Мой не устанавливал описание в допустимое значение. Надеюсь, это поможет. Возможно, вы уже нашли это решение, но не обновили свой пост.
То, что я говорю, - то, что продукт терпит неудачу из-за некоторой другой области. Неудачный тест проверяет, нет ли ошибок в продукте, созданном с каждым image_url. Вам просто нужно проверить, что функция конструктора, new_product, может создать правильный продукт.
Похоже, вы пропустили подчеркивание _
тест "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