2013-06-06 1 views
0

У меня есть следующий код:Понимание assert_equal в Test :: Unit с Рубином на Rails

test "unique title" do 
    product = Product.new(title:  products(:ruby).title, 
          description: 'yyy', 
          price:  1, 
          image_url: "fred.gif") 

    assert !product.save 
    puts product.errors[:title].join('; ') 
    assert_equal "has already been taken", product.errors[:title].join('; ') 
    end 

тест проходит. Но я не понимаю, почему assert_equal не вызывает ошибку.

Поскольку «уже принято» не равно: ProductTest#test_unique_titlehas already been taken

которого является выходом заявления Кладет.

Зачем проходит этот тест?

+1

Я думаю, что вы сбиты с толку, потому что в вашем выходе нет какой-либо новой строки. 'ProductTest # test_unique_title' описывает метод тестирования, который вы используете, и' уже был принят' является результатом ваших 'puts', поэтому тест должен пройти. – oldergod

+0

Насколько я понимаю, вы должны были дать ему ответ, чтобы я мог наградить вас за репутацию :). Я предполагаю, что тестовая среда автоматически показывает метод, который выполняется при получении любого вывода. – Senjai

+0

Добавил его в качестве ответа, чтобы вы могли его принять и закрыть вопрос. – oldergod

ответ

2

Я думаю, вы сбиты с толку, потому что в вашем выходе нет какой-либо новой строки. ProductTest # test_unique_title описывает метод тестирования, который вы используете, и уже был взят, является результатом ваших пометок, поэтому тест должен пройти

1

Полностью из вашего вопроса. Но вам не нужно сохранять запись, чтобы проверить, действительно ли она. Вы можете назвать действительным? метод для заполнения ошибок.

test "unique title" do 
    product = Product.new(title:  products(:ruby).title, 
          description: 'yyy', 
          price:  1, 
          image_url: "fred.gif") 

    assert !product.valid? 
    assert_equal "has already been taken", product.errors[:title].join('; ') 
end