2013-02-28 61 views
1

給定一個簡單的用戶模型,在帶有名稱,電子郵件和admin布爾的Rails 4中,使用RSpec測試質量分配的最佳方法是什麼?如何使用RSpec測試Rails 4中的質量分配

這裏的UsersController:

def create 
    @user = User.new user_params 
    ...snip 
end 

private 

    def user_params 
    params.require(:user).permit(:name, :email) 
    end 

,並在測試這個兩個不同的嘗試:

在user_spec.rb

describe "accessible attributes" do 
    describe "should not allow access to admin" do 
    before do 
     @user.admin = "1" 
     @user.save 
    end 
    it { should_not be_admin } 
    end 
end 

或users_controller_spec.rb

it 'should only allow name and email to be set' do 
    @controller.user_params.keys.should eq(['name', 'email') 
end 

都不行 - 前者只是創建一個管理員設置爲true的用戶(未通過測試) - 可能會繞過strong_parameters。後者工作,但只有在user_params方法不是私有的情況下才有效。 (官方文檔建議將其設置爲私有。注意 - 在user_spec中觀看MassAssignment錯誤也不起作用(不會產生錯誤)

注 - 實際上在視圖中正確設置用戶爲admin - admin屬性被過濾掉,所有的幸福,但真的想看到這個正常工作在測試

另一種建議是使用早該-的匹配寶石與user_spec.rb:

describe User do 
    ... 
    it { should_not allow_mass_assignment_of(:admin) } 
    ... 
end 

(這也不起作用),給出:

Failure/Error: it { should_not allow_mass_assignment_of(:admin) } 
NoMethodError: 
    undefined method `active_authorizer' for #<Class:0x007f93c9840648> 

(我認爲這個錯誤是由於shoulda-matchers不是Rails 4兼容的事實)。

在此先感謝!

+0

看看https://github.com/thoughtbot/shoulda-matchers – 2013-02-28 13:11:03

+0

看起來並不像是一個工作,目前,越來越:NoMethodError: 未定義的方法'active_authorizer」(可能是由於Rails 4處於測試階段) – Tom 2013-02-28 13:16:26

+0

描述用戶做 它{should_not_allow_mass_assignment_of(:admin)} end -------> 使用它頂部 – 2013-02-28 13:22:35

回答

0
it "should not allow mass assignment" do 
    raw_parameters = { :admin => 1 } 
    parameters = ActionController::Parameters.new(raw_parameters) 
    expect {@user.update_attributes(parameters)}.should raise_error 
end 

爲了測試質量分配,您應該模擬來自控制器的傳遞參數。

https://github.com/rails/strong_parameters#use-outside-of-controllers

+0

失敗/錯誤仍然失敗:它{should_not be_admin}期望管理員?返回false,成立true – Tom 2013-02-28 14:49:32

+0

你的用戶模型中是否有'attr_accessible'或'attr_protected'? – 2013-02-28 14:50:14

+0

這是Rails 4,attr_accessible不再使用,因爲它被強壯的參數取代? (所以,不,在回答你的問題) – Tom 2013-02-28 14:53:54