我正在尝试在应用程序控制器上测试一个将用作前置过滤器的方法。为此,我在测试中设置了一个匿名控制器,并应用了之前的过滤器以确保其正常运行。
测试目前看起来像这样:
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
答案 0 :(得分:19)
你不能通过以下方式解决这个问题:
render :nothing => true
在#index
行动中?
答案 1 :(得分:3)
除非事情从this blog post更改,否则RSpec 2需要一个视图模板文件才能使控制器规格生效。文件本身不会呈现(除非您添加render_views
),因此内容无关紧要 - 实际上您只需添加touch index.html.erb
的空文件。
答案 2 :(得分:2)
更好的方法是创建一个虚拟视图目录。我不会使用spec / views,因为这实际上是用于有效的视图测试。而是创建此目录结构:
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中,由于某种原因似乎无法在那里工作。