So testen Sie den Render-Status: 404 mit Rails4 und RSpec bei Verwendung von rescue_from

Ich habe eine Rails4-Anwendung mit einem "PagesController".

Die show-Methode löst eine benutzerdefinierte Exception 'PageNotFoundError' aus, wenn eine Seite nicht gefunden wird.

Oben auf dem Controller habe ich definiertrescue_from PageNotFoundError, with: :render_not_found

render not found ist eine private Methode vonPagesController und sieht aus wie:

def render_not_found
  flash[:alert]=t(:page_does_not_exists, title: params[:id])
  @pages = Page.all
  render :index, status: :not_found #404
end

Das Rails-Log im Entwicklungsmodus zeigt:

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)

So scheint es, dass mein: status =>: not_found funktioniert.

Wenn ich es tuecurl -v http://0.0.0.0:3000/pages/readmef Lockenstämme

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

Der folgende Test mit RSpec schlägt jedoch fehl:

 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

Alles sieht gut aus und sogar im test.log steht 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)

Ich habe verschiedene Server ausprobiert, WebRICK, Thin, Unicorn. Im Entwicklungs- und Produktionsmodus funktioniert alles wie erwartet. Auch das test.log ist korrekt, aber der Test schlägt fehl.

Kann mir jemand sagen, warum der Test 200 statt 404 sagt?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage