при использовании assert_equal и .join method не удалось пройти модульное тестирование при изучении RoR с книгой Agile Development с Ruby on Rails - PullRequest
0 голосов
/ 01 августа 2011

Я только начал изучать Ruby on Rails, даже сам язык Ruby.после прочтения Итерации B2: модульное тестирование моделей и выполнения следующего упражнения: 1. Параметр проверки: длина проверяет длину атрибута модели.Добавьте проверку к модели Продукта, чтобы убедиться, что заголовок имеет длину не менее десяти символов.2. Измените сообщение об ошибке, связанное с одной из ваших проверок.

Я поместил следующий код в /models/product.rb

validates_uniqueness_of :title, :message => 'has already been taken'
validates_length_of :title, :minimum => 8, :message => 'must be at least 8 letters'

и поместил следующие коды в / unit / product_test.рб

test "product is not valid without a 8 letters title" do
product = Product.new(:title =>"12345678",
                      :description => "yyy",
                      :price => 1,
                      :image_url => "fred.gif")
product.title = "abcdefg"
assert product.invalid?
assert_equal "must be at least 8 letters", product.errors[:title].join('; ')
product.title = "abcdefgh"
assert product.valid?    
end

test "product is not valid without a unique title" do
product = Product.new(:title => products(:lighting).title,
                      :description => "yyy",
                      :price => 1,
                      :image_url => "fred.gif")
assert !product.save
assert_equal "has already been taken", product.errors[:title].join('; ')

end

но когда я запускаю тест рейка, возникает сбой, который я не могу понять, как его решить, он показывает:

1) Failure:
test_product_is_not_valid_without_a_unique_title(ProductTest)
/Users/youngoo/Development/RubyonRails/anaheim/test/unit/product_test.rb:66]:
<"has already been taken"> expected but was
<"has already been taken; must be at least 8 letters">.

как это происходит?и как я могу это сделать?я думал, что проблема связана с присоединиться метод спасибо!

1 Ответ

0 голосов
/ 01 августа 2011

Вместо assert_equal, попробуйте использовать assert_match вот так ...

assert_match /has already been taken/, product.errors[:title].join('; ')

Вы на правильном пути.

РЕДАКТИРОВАТЬ: Если assert_match подлежит амортизации,

assert_not_nil /has already been taken/.match(product.errors[:title].join('; ')

должен дать тот же результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...