Comment faire pour tester le rendu de statut: 404 avec Rails4 et RSpec lors de l'utilisation de rescue_from
J'ai un Rails4 application avec un "PagesController'.
Le show-méthode lève une Exception personnalisée 'PageNotFoundError" quand une Page n'est pas trouvée.
Sur le haut de la manette j'ai défini
rescue_from PageNotFoundError, with: :render_not_found
render not found
est une méthode privée de PagesController
et ressemble:
def render_not_found
flash[:alert]=t(:page_does_not_exists, title: params[:id])
@pages = Page.all
render :index, status: :not_found #404
end
Les rails-journal de développement-le mode de montre:
Started GET "/pages/readmef" for 127.0.0.1 at 2013-08-02 23:11:35 +0200
Processing by PagesController#show as HTML
Parameters: {"id"=>"readmef"}
..
Completed 404 Not Found in 14ms (Views: 12.0ms)
Donc, il les coutures de mon :statut => :not_found œuvres, jusqu'à présent.
Quand je fais curl -v http://0.0.0.0:3000/pages/readmef
curl journaux
curl -v http://localhost:3000/pages/readmef
* About to connect() to localhost port 3000 (#0)
* Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /pages/readmef HTTP/1.1
> User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
> Host: localhost:3000
> Accept: */*
>
< HTTP/1.1 404 Not Found
< X-Frame-Options: SAMEORIGIN
Mais le test suivant avec RSpec échoue:
it 'renders an error if page not found' do
visit page_path('not_existing_page_321')
expect(response.status).to eq(404)
within( '.alert-error' ) do
page.should have_content('Page not_existing_page_321 doesn\'t exist')
end
end
1) PagesController renders an error if page not found
Failure/Error: expect(response.status).to eq(404)
expected: 404
got: 200
Tout semble parfait et même le test.journal dit 404
$ tail -f log/test.log
Started GET "/pages/not_existing_page_321" for 127.0.0.1 at 2013-08-03 09:48:13 +0200
Processing by PagesController#show as HTML
Parameters: {"id"=>"not_existing_page_321"}
Rendered pages/_page.haml (0.8ms)
Rendered layouts/_navigation.haml (0.6ms)
Rendered layouts/_messages.haml (0.2ms)
Rendered layouts/_locales.haml (0.3ms)
Rendered layouts/_footer.haml (0.6ms)
Completed 404 Not Found in 6ms (Views: 4.5ms)
J'ai essayé différents Serveurs, WebRICK, Mince, la licorne. Tout fonctionne comme prévu dans le développement et la production de la mode. Même le test.le journal est correcte, mais si le test échoue.
Quelqu'un peut-il me dire pourquoi le test dit de 200 au lieu de 404?
- Vous enroulée
pages/readme
, paspages/readmef
. Et vous n'avez pas compris votre code de test. - rougir @sevenseacat votre droit, je ne vois pas le manque de f dans la boucle de commande. Et en effet curl fonctionne très bien et d'y répondre avec 404. _I devrait vraiment utiliser mes lunettes :/ Mais la spec ne fonctionne toujours pas. Je l'ai ajouté ci-dessus.
- Merci pour votre commentaire. Il me conduit au vrai problème . J'ai formulé la question à nouveau.
- Question similaire ici stackoverflow.com/questions/18034644/...
Vous devez vous connecter pour publier un commentaire.
Une autre approche avec RSpec 3+ serait de tester pour une exception:
Bien que je ne suis pas très heureux avec cette solution, au moins c'est un travail autour de:
J'ai découpé le test en deux spécifications. Un pour tester le code de réponse 404 (avec GET au lieu de la visite) et un deuxième pour tester l'alerte. Le deuxième test est nécessaire parce que
get
ne pas rendre la vue - même sirender_views
est défini sur le dessus de la spécification de fichier.Le problème ici est que vous confondez Capybara tests de fonctionnalités et RSpec contrôleur de tests.
visit
est une méthode fournie par Capybara etget
/response
sont fournis par RSpec contrôleur de tests - vous ne pouvez pas les utiliser ensemble.Pour tester cela comme une seule RSpec contrôleur de test que vous pouvez faire:
(N. b. Le get ligne est différent de ce que vous avez posté - je n'ai pas inclus le
controller
param que si vous le mettez dansspec/controllers/pages_controller_spec.rb
où il appartient, vous n'en avez pas besoin)Ou comme un seul Capybara de test de fonctionnalité: