2012-04-22 2 views
1

Я новичок и пытаюсь изучить Rails, используя книгу Agile Web Development with Rails, четвертое издание (для Rails 3.2). До сих пор можно было пройти через все главы без икоты. Если были ошибки, это был обычно мой неряшливый код (забыв о запятой, «конец» и т. Д.). Но теперь я попал в ловушку в главе «Unit Testing for Models». В той части, где мы проверяем, что URL-адрес изображения заканчивается либо .gif, .jpg, либо .png.Почему мой идентификатор модуля image_url не работает? (от Agile Web Development с учебником Rails «Depot»)

Я скопировал код дословно из книги файла депо/тест/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 

Но когда я запускаю тест грабель: блоки команды, я получаю отказ .. .

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, я могу.


UPDATE: Был опечатка в моей модели Products, которая была причиной неудачной проверки. Все исправлено.

ответ

0

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

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

+0

Да, получается, что произошла ошибка в моей модели продукта с этой линии: 'проверяет: IMAGE_URL, allow_blank: правда , format: {with:% r {\. (gif | jpg | png) $} i, message: 'должен быть URL для изображения GIF, JPG или PNG'} ' Тест проходит сейчас. Спасибо за помощь. – coolc0d3r

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 
3

У меня была такая же проблема, и мне пришлось изменить свое определение для 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 

Как вы можете видеть, я не использовал «_» в моем тестовом имени и моих пройденных тестов.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^