Назначения были извлечены в драгоценный камень. Используйте гем 'rails-controller-testing'. Есть ли альтернатива для драгоценного камня? - PullRequest
0 голосов
/ 02 ноября 2018

Я пишу несколько тестов для задач контроллера, действие index, в котором есть переменная экземпляра @tasks со всеми задачами (Task.all).

Если я следую официальной документации:

RSpec.describe TeamsController do
  describe "GET index" do
    it "assigns @teams" do
      team = Team.create
      get :index
      expect(assigns(:teams)).to eq([team])
    end

    it "renders the index template" do
      get :index
      expect(response).to render_template("index")
    end
  end
end

Метод assigns перемещен в файл gem 'rails-controller-testing'. У меня два вопроса:

1 - Как мне достичь того же, что и expect(assigns(:teams)).to eq([team]). Наверное, я спрашиваю, как я могу проверить, есть ли у меня переменная экземпляра в действии index со значениями [team]

2 - Если этот метод был перенесен в гем, я прочитал в выпусках Github, что причина в том, что вы не должны тестировать его там, контроллер должен просто тестировать ответ, куки и т. Д. Но я запутался, так как в С удовольствием вы можете проверить экземпляр переменной. Должен ли я проверить это там или нет? Если нет, то где? В моем views / index_spec.rb тестировании на наличие всех команд?

3 - Альтернатива: поскольку TeamsController является обычным классом, я должен создать спецификацию в папке spec / models / folder spec/models/tasks_controller.rb и проверить, есть ли у метода index переменная экземпляра @teams с содержимым, которое я хочу

Спасибо

1 Ответ

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

Идея заключается в том, что вместо того, чтобы тыкать в свой контроллер и проверять его внутренние переменные, вы должны проверять свои контроллеры, проверяя вывод.

В RSpec вы можете сделать это с помощью спецификации запросов и функций.

# config/specs/features/teams_spec.html
RSpec.feature 'Teams' do
  scenario 'when a user views the teams' do
    Team.create(name: 'Team Rocket')
    visit '/teams'
    expect(page).to have_content 'Team Rocket'
  end
end 

# config/specs/requests/teams_spec.html
RSpec.describe 'Teams', type: :request do
  describe 'GET /teams.json' do
    it "includes the team" do
      team = Team.create(name: 'Team Rocket')
      get teams_path(format: :json) 
      expect(parsed_response.first['name']).to eq 'Team Rocket'
    end  
  end
  describe 'GET /teams' do
    it "includes the team" do
      team = Team.create(name: 'Team Rocket')
      get teams_path
      expect(page).to have_content 'Team Rocket'
    end  
  end
end

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

1 - Как я могу добиться того же, что и ожидал (назначает (: команды)). э ([команда]). Наверное, я спрашиваю, как я могу проверить, есть ли у меня экземпляр переменная в действии index со значениями [team]

Либо используйте гем назначений для унаследованной совместимости, либо протестируйте визуализированный вывод.

2 - Если этот метод был перемещен в гем, я прочитал в выпусках Github, причина в том, что вы не должны проверять это там, контроллер должен просто проверить ответ, куки и т. д. Но я запутался, так как в радости вас может проверить переменную экземпляра. Должен ли я проверить это там или нет? Если не, где? В моем views / index_spec.rb тестировании, если у меня есть все команды?

Если под Relish вы подразумеваете RSpec, то для RSpec-rails требуется некоторое время, чтобы догнать современный уровень в тестировании Rails. Но то же самое все еще применяется. Официальная рекомендация команды RSpec состоит в том, чтобы не использовать присваивания и изменять спецификации контроллеров в пользу спецификаций запросов. Спецификации представлений здесь не очень актуальны - они используются, если вы хотите тестировать сложные представления изолированно.

3 - Альтернатива: поскольку TeamsController является нормальным классом, я должен создать спецификацию в папке spec / models / spec / models / tasks_controller.rb и проверьте, есть ли индекс метода переменная экземпляра @teams с содержимым, которое я хочу?

Просто нет. Контроллеры - это не просто нормальные классы. Вы не можете просто создать экземпляр контроллера с MyController.new, поэтому в тестах контроллеров все это происходит.

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