【问题标题】:Rspec stubing view for anonymous controller匿名控制器的 Rspec 存根视图
【发布时间】:2011-02-28 21:24:25
【问题描述】:

我正在尝试在应用程序控制器上测试将用作前置过滤器的方法。为此,我在测试中设置了一个匿名控制器,并应用了 before 过滤器以确保其正常运行。

目前的测试如下所示:

describe ApplicationController do
  controller do
    before_filter :authenticated

    def index      
    end
  end

  describe "user authenticated" do
    let(:session_id){"session_id"}
    let(:user){OpenStruct.new(:email => "pythonandchips@gmail.com", :name => "Colin Gemmell")}

    before do
      request.cookies[:session_id] = session_id
      UserSession.stub!(:find).with(session_id).and_return(user)
      get :index
    end

    it { should assign_to(:user){user} }

  end
end

而应用控制器是这样的:

class ApplicationController < ActionController::Base
  protect_from_forgery

  def authenticated
    @user = nil
  end
end

我的问题是当我运行测试时出现以下错误

1) ApplicationController user authenticated 
   Failure/Error: get :index
   ActionView::MissingTemplate:
     Missing template stub_resources/index with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>[:html], :locale=>[:en, :en]} in view paths "#<RSpec::Rails::ViewRendering::PathSetDelegatorResolver:0x984f310>"

根据文档,视图不是 rendered when running controller tests,但这表明此操作不存在存根(这是可以理解的,因为视图不存在)

任何人都知道如何解决这个问题或排除视图。

干杯 科林·G

【问题讨论】:

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


    【解决方案1】:

    你不能通过放置来解决这个问题:

    render :nothing => true
    

    #index 操作中?

    【讨论】:

    • head :ok 用于 Rails 5
    【解决方案2】:

    除非从 this blog post 发生变化,否则 RSpec 2 需要一个视图模板文件才能使控制器规范工作。文件本身不会被渲染(除非你添加render_views),所以内容并不重要——事实上你可以简单地使用touch index.html.erb添加一个空文件。

    【讨论】:

    • 我必须在“app/views/anonymous/index.html.erb”中添加一个虚拟模板。我不知道如何在规范/视图下关闭虚拟视图。
    • 你说得对——空模板进入app/views,而不是spec/views,这是有道理的,因为这是 Rails 寻找它的地方。
    • 你可以告诉它在spec/views下寻找虚拟视图,如果你在application.rb中添加下面这行:`#为匿名控制器测试添加一个视图目录config.paths['app/views'] &lt;&lt; "spec/views" if Rails.env.test?
    【解决方案3】:

    一个更好的方法是创建一个虚拟视图目录。我不会使用规范/视图,因为这实际上是用于有效的视图测试。相反,创建这个目录结构:

    spec/test_views/anonymous
         index.html.erb
         ... and any other anonymous controller templates you happen to need ...
    

    如前所述,index.html.erb 可以为空,因为 rspec2 仅检查是否存在,而不检查内容。

    然后在你的 application.rb 初始化器中,放置这一行:

    # add a view directory for the anonymous controller tests
    config.paths['app/views'] << "spec/test_views" if Rails.env.test?
    

    注意:我尝试将该行放在 test.rb 中,但由于某种原因似乎在那里不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2023-03-31
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多