title: How to test render status: 404 with Rails4 and RSpec when using rescue_from
body: <p>I have a Rails4 application with a 'PagesController'.</p>
  
  <p>The show-method throws a customized Exception 'PageNotFoundError' when a Page is not found.</p>
  
  <p>On top of the controller I defined
  <code>rescue_from PageNotFoundError, with: :render_not_found</code></p>
  
  <p><code>render not found</code> is a private method of <code>PagesController</code> and looks like:</p>
  
  <pre><code>def render_not_found
    flash[:alert]=t(:page_does_not_exists, title: params[:id])
    @pages = Page.all
    render :index, status: :not_found #404
  end
  </code></pre>
  
  <p>The rails-log in development-mode shows:</p>
  
  <pre><code>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"=&gt;"readmef"}
    ..
    Completed 404 Not Found in 14ms (Views: 12.0ms)
  </code></pre>
  
  <p>So, it seams my :status => :not_found works, so far.</p>
  
  <p>When I do <code>curl -v http://0.0.0.0:3000/pages/readmef</code> curl logs</p>
  
  <pre><code>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)
  &gt; GET /pages/readmef HTTP/1.1
  &gt; User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
  &gt; Host: localhost:3000
  &gt; Accept: */*
  &gt;
  &lt; HTTP/1.1 404 Not Found
  &lt; X-Frame-Options: SAMEORIGIN
  </code></pre>
  
  <p>But the following test with RSpec fails:</p>
  
  <pre><code> 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
  </code></pre>
  
  <p>Everything looks fine and even the test.log says 404</p>
  
  <pre><code>$ 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"=&gt;"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)
  </code></pre>
  
  <p>I tried different Servers, WebRICK, Thin, unicorn. Everything works as expected in development and production mode. Even the test.log is correct but the test fails.</p>
  
  <p>Can anybody tell me why the test says 200 instead of 404?</p>