ruby-on-rails – 如何测试渲染状态:使用Rails4和RSpec时使用rescue_from

我有一个带有“PagesController”的Rails4应用程序.

当没有找到页面时,show-method将抛出一个自定义的异常“PageNotFoundError”.

在我定义的控制器的顶部
rescue_from PageNotFoundError,具有::render_not_found

render not found是PagesController的私有方法,如下所示:

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

rails-log开发模式显示

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)

所以,它接缝我的:status => :not_found工作,到目前为止.

当我执行curl -v http://0.0.0.0:3000/pages/readmef卷曲日志

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

但是使用RSpec进行以下测试失败:

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

一切看起来都很好,甚至test.log说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)

我尝试过不同的服务器,WebRICK,Thin,独角兽.一切都按照预期在开发和生产模式下工作.即使是test.log也是正确的,但测试失败.

有人可以告诉我为什么测试说200而不是404?

解决方法

虽然我对这个解决方案并不满意,至少这是一个工作:

我将测试分成两个独立的规格.一个用于测试响应代码404(使用GET而不是访问),另一个用于测试警报.第二个测试是必要的,因为get不会渲染视图 – 即使在规范文件之上定义了render_views.

it 'response with 404 if page not found' do
    get :show,{ controller: 'pages',id: 'not_existing_page_321' }
    expect(response.status).to eq(404)
  end

  it 'renders an error-message if page not found and shows index' do
    visit page_path('page_not_found')
    within '.alert-error' do
      page.should have_content("Page page_not_found doesn't exist")
    end
  end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...