2011-04-23 14 views
8

[好吧......我的第一個問題,所以要溫柔。]問題的「後打造」我的色器件控制器rspec的

我使用的設計我的身份驗證,但我有自己的控制器來擴展會發生什麼當用戶被創建時。我在註冊(註冊)時創建「用戶」和「代理機構」。

在路線...

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 

但是,我收到「後創建」的錯誤。以下是錯誤消息

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

,這是(我認爲)的「回扣路線」

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

任何想法的相關行?

輕拍

+2

我發現(通過試驗和錯誤),其將所述線 request.env [「devise.mapping」] = Devise.mappings [:用戶] 該規範測試導致該測試到現在執行。但我不太明白這條線是什麼 - 所以評論將不勝感激。 – Pat 2011-04-23 23:37:42

回答

11

具體而言,複製出從由@shanethehat引用的鏈接,線路

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

片段解決了提出的問題的問題。只需將該行放入before_filter即可進行Devise-flavored控制器測試。將:admin更改爲有問題的資源(通常爲:user

原因是有效的:單獨描述SessionsController並不會唯一標識特定的Devise資源。例如,如果您的應用程序擁有adminuser資源,則您可能希望有2 SessionsController(s)具有2組規格 - 每種資源類型一個。

在這種情況下,爲了讓每個測試在正確的資源上運行,您需要告訴設計您爲每組示例指定了哪一個SessionsController(s)。上面的行就是這樣。