我的设计控制器rspec中的“post create”问题

时间:2011-04-23 17:38:19

标签: ruby-on-rails rspec devise

[好吧......我的第一个问题,所以要温柔。]

我正在使用设计进行身份验证,但我有自己的控制器来扩展创建用户时发生的事情。我在注册时(注册)创建了“用户”和“代理商”。

在路线......

 devise_for :users, :controllers => {:registrations => "registrations"}

我的完整控制器......

 class RegistrationsController < Devise::RegistrationsController
   def create
     super # creates the @user
     @agency = Agency.create! params[:agency]
     @agency.users << @user
     @agency.owner = @user
     @user.agency = @agency
     @agency.save
     @user.account_admin = true
     @user.save
   end
 end

我的问题是我想设置一个rspec来检查这段代码。代码似乎工作正常,但我在我的规格中拍摄100%的代码覆盖率。这是我的整个规范...

 require 'spec_helper'
 describe RegistrationsController do
   render_views  
   describe "POST create" do
     it "creates an associated user" do
       @agency = Factory.create( :agency )
       @user = Factory.create( :user, :agency => @agency )
       User.stub(:new).with({'name' => 'pat'}) { @user }
       Agency.stub(:new).with({'name' => 'pat'}) { @agency }
       post :create, :user => {'name' => 'pat'}
       assigns(:user).should be(@user)
     end
   end
 end

但是,我在“post create”上收到错误。这是错误消息

 Could not find devise mapping for path "/users?user[name]=pat"

这是(我认为)“rake routes”中的相关行

 user_registration POST   /users(.:format)  {:action=>"create",:controller=>"registrations"}

有什么想法吗?

1 个答案:

答案 0 :(得分:11)

具体来说,从@shanethehat引用的链接中复制一个片段

@request.env["devise.mapping"] = Devise.mappings[:admin]

解决了问题中提出的问题。只需将该行放入before_filter即可进行Devise风格的控制器测试。将:admin更改为相关资源(通常为:user

可行的原因:单独描述SessionsController并不能唯一标识特定的Devise资源。例如,如果您的应用拥有adminuser资源,您可能希望拥有2个SessionsController(s)和2套规格 - 每种资源类型一个。

在这种情况下,对于在正确的资源上运行的每个测试,您需要告诉Devise您对每组示例的SessionsController(s)是哪个。上面这一行就是这样。