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?
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')
vous pouvez le faire de cette façon:
expect(current_path).to eql(new_app_user_registration_path)
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.
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