Метод 'назначает' не найден в rspec capybara - PullRequest
0 голосов
/ 07 июня 2018

У меня в контроллере следующий код:

private
def remaining_words
    @remaining_words = Vocab.all.where.not(id: session[:vocab_already_asked])
    @questions_remaining = @remaining_words.length - 4
    @quiz_words = @remaining_words.shuffle.take(4)

И вот мой тест:

feature 'Quiz functionality'   do
  scenario "gets 100% questions right in quiz" do
    visit(root_path)
    visit(start_quiz_path)

    assigns(:questions_remaining).length.to_i.times do
      orig_value = find('#orig', visible: false).value
      choose(option: orig_value)
      click_on('Submit')
      expect(page).to have_content('You got it right!')
      expect(page).not_to have_content('Sorry, wrong answer!')
    end

    expect(page).to have_content("Your score is 27/27")
    save_and_open_page
  end
end

При запуске теста появляется сообщение об ошибке:

NoMethodError: undefined method `assigns' for #<RSpec::ExampleGroups::QuizFunctionality:0x007f8f2de3f2b0>
     # ./spec/features/quizzes_spec.rb:9:in `block (2 levels) in <top (required)>'

Я также попытался использовать controller.instance_variable_get (: Остальное_Words) и получил это сообщение об ошибке

NameError:
       undefined local variable or method `controller' for #<RSpec::ExampleGroups::QuizFunctionality:0x007fc4b99251a0>

Я что-то упустил при настройке теста?Должен ли я использовать description вместо функции для включения метода assign?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

assigns был доступен только в тестах контроллера - в Rails 5 он был устаревшим.

Тестирование переменных экземпляра, установленных вашим контроллером, является плохой идеей.Это серьезно выходит за рамки того, о чем должен знать тест.Вы можете проверить, какие файлы cookie установлены, какой HTTP-код возвращается, как выглядит представление или какие мутации произошли с БД, но проверка внутренних возможностей контроллера просто не очень хорошая идея.
- Дэвид Хайнемайер Ханссон

В спецификациях контроллера RSpec используется устаревшая ActionController::TestCase.

Спецификация контроллера определяется наличием метаданных type: :controller.

RSpec.describe ThingsController, type: :controller do
  # ...
  describe "GET #index" do
  end
end

Если вы установили config.infer_spec_type_from_file_location! в config.infer_spec_type_from_file_location! RSpec выведет, что любая спецификация в spec/controllers имеет type: :controller.

Следует избегать спецификаций контроллера для новых приложений впользу запроса и технические характеристики.Одна из основных проблем со спецификациями контроллеров, кроме нарушения инкапсуляции, заключается в том, что весь этап запроса заглушается, запрос фактически не проходит через стойку или маршруты, которые могут маскировать ошибки маршрутизации, и означает, что промежуточное ПО Rack, такое как Warden (используется Devise)или сеансы должны быть заглушены.

Если у вас есть устаревшее приложение, вы можете повторно ввести assigns с драгоценным камнем .Если вы только изучаете RSpec, вам следует выбрать более современные учебные пособия.

Спецификации функций - это высокоуровневые тесты, предназначенные для демонстрации функциональности в приложении.Они должны управлять приложением только через его внешний интерфейс, обычно веб-страницы.
https://relishapp.com/rspec/rspec-rails/v/3-7/docs/feature-specs

Используйте спецификации функций для тестов высокого уровня, основанных на истории пользователя.Используйте RSpec.feature "New Cool Feature" для написания спецификации функции.

Спецификации запроса предоставляют тонкую оболочку для интеграционных тестов Rails и предназначены для управления поведением через полный стек, включая маршрутизацию (предоставляемую Rails) и без использования заглушек (это ваше дело).
https://relishapp.com/rspec/rspec-rails/v/3-7/docs/request-specs/request-spec

Используйте RSpec.describe "Some resource", type: :request для написания спецификации функции.

Спецификации запроса неоценимы для тестирования API 'или когда вам просто нужны быстрые тесты, которые гарантируют, что правильные мутациислучилось с БД или что отправлены правильные ответы http.

См .:

0 голосов
/ 07 июня 2018

Вы пишете спецификации функций / интеграционные тесты, которые не имеют доступа к переменным контроллера / экземпляра контроллера.Предполагается, что это скорее тест черного ящика, выполненный с точки зрения пользователей.При настройке данных для теста вы должны знать, сколько вопросов нужно задать, а затем либо жестко закодировать их в своем тесте, либо, еще лучше, определить на основе содержимого страницы, есть ли еще вопросы, на которые нужно ответить (так же, как пользовательпришлось бы).

...