Почему мой тестовый модуль 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
Другие вопросы по тегам