Почему мой модульный тест image_url не работает? (из учебника Agile Web Development with Rails 'Depot')

Я новичок и пытаюсь изучить Rails с помощью книги Agile Web Development with Rails, Fourth Edition (для Rails 3.2). Пока удалось пройти все главы без задержек. Если были ошибки, то это обычно был мой неаккуратный код (забытая запятая, выражение «конец» и т. д.). Но теперь я столкнулся с проблемой в главе о модульном тестировании моделей. В той части, где мы проверяем, что 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, я могу.


ОБНОВЛЕНИЕ. В моей модели продуктов была опечатка, которая приводила к сбою теста. Теперь все исправлено.


person coolc0d3r    schedule 22.04.2012    source источник


Ответы (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

Как видите, я не использовал '_' в названии своего теста, и мои тесты прошли успешно.

person aceofbassgreg    schedule 07.01.2013

Я считаю, что проблема в определении функции «new_product». Убедитесь, что функция устанавливает для всех полей допустимые данные. Мой не устанавливал описание в допустимое значение. Надеюсь, это поможет. Вероятно, вы уже нашли это решение, но не обновили свой пост.

Я говорю, что продукт терпит неудачу из-за какой-то другой области. Неудачный тест проверяет отсутствие ошибок в продукте, созданном с каждым image_url. Вам просто нужно проверить, что функция конструктора, new_product, может создать допустимый продукт.

person luther07    schedule 31.05.2012
comment
Да, оказывается, в моей модели Product была ошибка с этой строкой: validates :image_url, allow_blank: true, format: { with: %r{\.(gif|jpg|png)$}i, message: 'must be a URL for GIF, JPG or PNG image' } Сейчас тест проходит. Спасибо за помощь. - person coolc0d3r; 09.02.2013

Кажется, вам не хватает подчеркивания _

проверить "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
person OnkelK    schedule 15.09.2012

Я просто боролся с этим. В модели также была опечатка. С моими утверждениями. Я сгруппировал \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
person mbigras    schedule 17.11.2016