web-dev-qa-db-fra.com

Comment tester une redirection avec RSPEC et Capybara

Je ne sais pas ce que je fais mal, mais chaque fois que j'essaie de tester une redirection, je reçois cette erreur: "@Request doit être une action ActionDispatch :: Demande"

context "as non-signed in user" do
  it "should redirect to the login page" do
    expect { visit admin_account_url(account, Host: get_Host(account)) }.to redirect_to(signin_path)
  end
end
1) AdminAccountPages Admin::Accounts#show as non-signed in user should redirect to the login page
     Failure/Error: expect { visit admin_account_url(account, Host: get_Host(account)) }.to redirect_to(signin_path)
     ArgumentError:
       @request must be an ActionDispatch::Request
     # ./spec/requests/admin_account_pages_spec.rb:16:in `block (4 levels) in <top (required)>'

J'utilise RSPEC-rails (2.9.0) avec Capybara (1.1.2) et Rails 3.2. J'apprécierais que quelqu'un puisse aussi expliquer pourquoi cela se produit; pourquoi ne peut pas J'utilise l'attente de telle manière?

22
Mohamad

Capybara n'est pas une solution spécifique aux rails, donc il ne sait rien de la logique de rendu des rails.

Capybara est significative spécifiquement pour les tests d'intégration, ce qui explique essentiellement des tests du point de vue d'un utilisateur final interagissant avec un navigateur. Dans ces tests, vous ne devez pas affirmer des modèles, car un utilisateur final ne peut pas voir cela au fond de votre application. Ce que vous devriez plutôt tester, c'est qu'une action vous atterrisse sur le chemin correct.

current_path.should == new_user_path
page.should have_selector('div#erro_div')
39
Sagiv Ofek

vous pouvez le faire de cette façon:

expect(current_path).to eql(new_app_user_registration_path)
16
The Whiz of Oz

Le message d'erreur @request must be an ActionDispatch::Request vous dit que RSPEC-Rails Matchers redirect_to (il déléguette à Rails assert_redirected_to) s'attend à ce qu'il soit utilisé dans Rails Tests fonctionnels (devrait se mélanger à ActionController::TestCase). Le code que vous avez publié ressemble à une spécification de demande RSPEC-rails. Donc redirect_to n'est pas disponible.

La vérification de la redirection n'est pas prise en charge dans les spécifications de la demande RSPEC-Rails, mais est prise en charge dans Rails Tests d'intégration.

Que vous devriez vérifier explicitement la manière dont la redirection a été faite (qu'il s'agissait d'une réponse de 301 et non d'une réponse de 307 et non de JavaScript) est complètement à vous.

11
Art Shayderov

Voici une solution pirate que j'ai trouvée

# spec/features/user_confirmation_feature.rb

feature 'User confirmation' do
  scenario 'provide confirmation and redirect' do
    visit "/users/123/confirm"

    expect(page).to have_content('Please enter the confirmation code')
    find("input[id$='confirmation_code']").set '1234'

    do_not_follow_redirect do
      click_button('Verify')
      expect(page.driver.status_code).to eq(302)
      expect(page.driver.browser.last_response['Location']).to match(/\/en\//[^\/]+\/edit$/)
    end
  end

  protected

  # Capybara won't follow redirects
  def do_not_follow_redirect &block
    begin
      options = page.driver.instance_variable_get(:@options)
      prev_value = options[:follow_redirects]
      options[:follow_redirects] = false

      yield
    ensure
      options[:follow_redirects] = prev_value
    end
  end
end
7
Max