ВопросRspec2 + Rails4: Тестирование на отображенных модельных полей в форме частичной
Я хотел бы писать тесты, которые проверяют на модели поля, которые отображаются в моей «шоу» и «форма» обертонов. Мне удалось «показать», а не «форму».
Главное ограничение: решение должно иметь возможность прокручивать массив, содержащий все имена полей модели.
Я считаю, что этот случай может быть интересен всем, кто пытается сократить свои тестовые файлы сценариев, имея много полей и имея полный контроль над тем, что отображается, а что нет, поэтому я приложу некоторые усилия, пытаясь найти решение, с вашей помощью, если вы пожалуйста :)
вид Форма
Ничего особенного
= form_for @user do |f|
= f.select :field_1, options_from_collection_for_select ...
= f.text_field :field_2
...
Фактическая ситуация
Я нашел простой способ для «шоу» частичное, вот как мой файл спецификации выглядит следующим образом:
def user_fields_in_show_view
[:field_1, :field_2, ..., :field_n]
end
it 'display fields' do
user_fields_in_show_view.each do |field|
User.any_instance.should_receive(field).at_least(1).and_call_original
end
render
end
Это хорошо работает.
-
Но точно такой же метод не работает в "форме" частичный, используя один и тот же код
def user_fields_in_form_view # List of fields need to be different, because of the associations
[:field_1_id, :field_2, ..., :field_n]
end
it 'display fields' do
user_fields_in_form_view.each do |field|
User.any_instance.should_receive(field).at_least(1).and_call_original
end
render
end
Он скулит, как это:
Failure/Error: Unable to find matching line from backtrace
Exactly one instance should have received the following message(s) but didn't: field1_id, field_2, ..., field_n
# Backtrace is long and shows only rspec/mock, rspec/core, rspec/rails/adapters, and spork files
Я до сих пор не установлено
1- Я прокомментировал фрагмент моих тестов и выводя на консоль rendered
, чтобы вручную проверить, что создано моим представлением, и да, поля правильно сгенерированы.
2- я заменил User.any_instance
моделью Поручаю к мнению, ошибка немного отличается, но он по-прежнему не работает
it 'display fields' do
user = create :user
assign :user, user
user_fields_in_form_view.each do |field|
user.should_receive(field).at_least(1).and_call_original
end
render
end
Дает:
Failure/Error: user.should_receive(field).at_least(1).and_call_original
(#<User:0x0000000506e3e8>).field_1_id(any args)
expected: at least 1 time with any arguments
received: 0 times with any arguments
3- I измените код, так что it
находится внутри цикла, например:
user_fields_in_form_view.each do |field|
it 'display fields' do
user = create :user
assign :user, user
user.should_receive(field).at_least(1).and_call_original
render
end
end
Такой же результат, как указано выше
И у меня заканчиваются варианты. Я подозреваю, что внутренности FormBuilder играют на меня плохой трюк, но я не могу понять, я еще не очень хорошо разбираюсь в них.Спасибо за чтение
Что произойдет, если вы измените 'user.should_receive' на' User.any_instance.should_receive'? Работает ли тест в этом случае? – DNNX
Более загадочное выходное сообщение, но все же не проходящее – Benj
Хммм ... это интересно. Не могли бы вы показать код просмотра, пожалуйста? Кроме того, вы уверены, что вы вызываете 'first_name',' last_name' в коде? Возможно, есть такой код, как 'user.attributes.slice (* current_role.allowed_user_attrbutes) .each {| k, v | ...} '? – DNNX