Почему вспомогательные методы не работают с учетом спецификаций? - PullRequest
0 голосов
/ 02 сентября 2018

В моем представлении есть условие, основанное на вспомогательном методе, определенном в контроллере приложения, который я определил как вспомогательный метод.

<% if logged_in? %>

Когда моя спецификация попадает сюда, она говорит:

ActionView::Template::Error:
   undefined method `logged_in?' for #<#<Class:0x007fdc06b71aa8>:0x007fdc0b9b0930>

Когда я использую свой браузер, он работает отлично. Я попытался заглушить это, но я получаю другую ошибку, когда я пытаюсь заглушить это на представлении или контроллере. Вот как выглядит мой тест:

it "has a logout link" do
  render
  expect(rendered).to have_link "Logout"
end

Вот мой гемфайл:

ruby "2.4.1"

gem "bootsnap", ">= 1.1.0", require: false
gem "coffee-rails", "~> 4.2"
gem "jbuilder", "~> 2.5"
gem "pg"
gem "puma", "~> 3.11"
gem "rails", "~> 5.2.1"
gem "rails-controller-testing"
gem "sass-rails", "~> 5.0"
gem "turbolinks", "~> 5"
gem "uglifier", ">= 1.3.0"

group :development, :test do
  gem "byebug", platforms: %i[mri mingw x64_mingw]
end

group :development do
  gem "listen", ">= 3.0.5", "< 3.2"
  gem "spring"
  gem "spring-watcher-listen", "~> 2.0.0"
  gem "web-console", ">= 3.3.0"
end

group :test do
  gem "capybara", ">= 2.15"
  gem "chromedriver-helper"
  gem "factory_bot_rails"
  gem "rspec-rails", "~> 3.7"
  gem "selenium-webdriver"
  gem "shoulda-matchers", "~> 3.1"
end

1 Ответ

0 голосов
/ 02 сентября 2018

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

Быстрее и проще просто добавить вспомогательный метод, чтобы вернуть значение, которое вы хотите для данного теста:

context 'with a logged user' do
  before(:each) do
    allow(view).to receive(:logged_in?).and_return(true)
  end

  it 'has a logout link' do
    render
    expect(rendered).to have_link 'Logout'
  end
end

context 'with no logged user' do
  before(:each) do
    allow(view).to receive(:logged_in?).and_return(false)
  end

  it 'has a login link' do
    render
    expect(rendered).to have_link 'Login'
  end
end

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

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

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