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

jpw*_*ynn 10 rspec ruby-on-rails devise

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

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

最奇怪的是,尽管......我的所有规格都失败了,除非我it ... do在行后添加以下语句:

dummy=subject.current_user.inspect
Run Code Online (Sandbox Code Playgroud)

(使用该行,如下所示,规范通过.没有该行,所有测试都失败,分配为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
Run Code Online (Sandbox Code Playgroud)

根据设计维基,这里是我登录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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 14

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

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

def valid_session
  {"warden.user.user.key" => session["warden.user.user.key"]}
end
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你,@ Standlevitator!现在看,我认为你可以简单地做:def valid_session session end (2认同)

小智 13

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

 def valid_session
    {}
 end
 ...
   get :index, {}, valid_session
Run Code Online (Sandbox Code Playgroud)

由于这个'session'变量,你所做的"log_in"基本上没有在'get'中使用.

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

get :index, {}
Run Code Online (Sandbox Code Playgroud)

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