rail3 / rspec / devise:除非我添加一个dummy = subject.current_user.inspect,否则rspec控制器测试失败

我试图让RSpec为一个简单的脚手架应用程序工作,从rspec脚手架测试开始。

根据设计维基,我添加了各种设备配置条目,用户和管理员的工厂,我在规范控制器中做的第一件事是login_admin。

最奇怪的事情,虽然…我的所有规格都失败了除非我在it ... do之后添加以下声明it ... do line:

 dummy=subject.current_user.inspect 

(使用该行,如下所示,规范通过。没有该行,所有测试都失败,分配为nil而不是预期值。我只是发现当我放入一些puts语句来查看current_user是否是正确设置。)

所以它的行为就像虚拟语句以某种方式“强制”加载或刷新或识别current_user。

任何人都可以解释发生了什么,以及我应该做些什么不同,所以我不需要虚拟陈述?

 #specs/controllers/brokers_controller_spec.rb describe BrokersController do login_admin def valid_attributes {:name => "Bill", :email => "rspec_broker@example.com", :company => "Example Inc", :community_id => 1} end def valid_session {} end describe "GET index" do it "assigns all brokers as @brokers" do dummy=subject.current_user.inspect # ALL SPECS FAIL WITHOUT THIS LINE! broker = Broker.create! valid_attributes get :index, {}, valid_session assigns(:brokers).should eq([broker]) end end describe "GET show" do it "assigns the requested broker as @broker" do dummy=subject.current_user.inspect # ALL SPECS FAIL WITHOUT THIS LINE! broker = Broker.create! valid_attributes get :show, {:id => broker.to_param}, valid_session assigns(:broker).should eq(broker) end end 

根据设计维基,这里是我登录a:user或:admin的方式

 #spec/support/controller_macros.rb module ControllerMacros def login_admin before(:each) do @request.env["devise.mapping"] = Devise.mappings[:admin] sign_in Factory.create(:admin) # Using factory girl as an example end end def login_user before(:each) do @request.env["devise.mapping"] = Devise.mappings[:user] user = Factory.create(:user) user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module sign_in user end end end 

多么艰难! 谢谢罗宾,我一直在谷歌上搜索了几个小时,终于看到了你的post; 现在我的控制器测试正在运行:)

为了添加你的答案,我想出了如何将设计会话转换为valid_session哈希,这允许控制器测试正确地运行由rails生成。

 def valid_session {"warden.user.user.key" => session["warden.user.user.key"]} end 

在您的测试中,有以下代码:

  def valid_session {} end ... get :index, {}, valid_session 

由于这个’session’变量,你所做的“log_in”基本上没有在’get’中使用。

我解决它的方法是删除该控制器规范中get,post,put,delete调用的所有“valid_session”参数。 上面的例子变成:

 get :index, {} 

我怀疑有一种方法可以将设计的会话添加到“valid_session”哈希,但我不知道它是什么。

谢谢你的解决方案。

如果您使用的是其他Devise模型,则会话ID也会更改。

对于模型管理员,请使用以下内容:

 def valid_session {'warden.user.administrator.key' => session['warden.user.administrator.key']} end