rspec render_views忽略布局?想测试静态缓存页面不显示flash消息

时间:2011-08-28 13:55:51

标签: ruby-on-rails-3 rspec rspec-rails

我正在尝试测试通过rails生成的“静态”页面(它们是ERB,但是被缓存),不会渲染任何由身份验证系统(Devise)或其他任何地方遗留的杂散闪存通知。

我试过编写这个控制器规范,但似乎response.body只渲染模板,而不是它的布局?

  describe "so that static caching can be used" do
    render_views
    specify "flash notices are not rendered" do
      # edit: the following flash lines don't do anything
      # it's not the right flash object, this one is intended for
      # inspecting after request not setting before request
      flash[:notice] = "flash boo" 
      flash[:error] = "flash boo"
      flash[:alert] = "flash boo"
      get :show, :page => 'privacy_policy'
      response.body.should have_content('flash boo')
    end
  end

class StaticPagesController < ApplicationController
  layout 'master'

  def show
    response.headers['Cache-Control'] = "public, max-age=#{6.hours}"
    render "static_pages/#{params[:page]}"
  end
end

我已尝试更改为可以渲染Flash通知的布局,甚至将文本插入布局模板,但无法使规范失败。

有没有办法让rspec用适当的布局渲染模板?

控制器是否以错误的方式尝试执行此操作? 它似乎不合适,因为它更多地与使用哪些布局及其内容有关,但渲染过程从控制器开始,它接收结果,我可以在渲染之前操作闪存哈希内容。

版本: rails(3.0.10), rspec-rails(2.6.1), rspec-core(2.6.4)

谢谢,尼克

1 个答案:

答案 0 :(得分:0)

原来这不是正确的做法。它应该是一个集成测试(黄瓜,请求规范等),因为它正在测试几个层。那和rails似乎没有在这个级别上将模板呈现在它们的布局中。

所以在集成测试中: 通过向控制器发出请求来设置闪存消息,该控制器不执行任何其他操作(在测试代码中创建虚拟控制器和路由),然后点击关注页面并确保不呈现闪存通知。

e.g。 https://gist.github.com/1178383

这似乎是一个很长的路,但它会覆盖它。