2012-06-11 50 views
1

我有一個用戶模式:兩個類似RSpec的測試,給出了相反的結果

class User < ActiveRecord::Base 
    attr_accessible :email, :name 
    # admin only 
    attr_accessible :email, :name, :admin, :as => :admin 

而下面的模型規格:

describe "accessible attributes" do 

    let(:new_user){ FactoryGirl.create(:user) } 
    @admin_attrs = { admin: true, name: "ben", email: "[email protected]"} 

    it "can not be set on create" do 

    # variant 1 - test fails, AM::MAS::Error NOT thrown 
    expect do 
     User.new(@admin_attrs) 
    end.should raise_error(ActiveModel::MassAssignmentSecurity::Error) 

    # variant 2 - test passes, AM::MAS::Error NOT thrown 
    expect do 
     User.new(admin: true, name: "ben", email: "[email protected]", password: "123xyz", password_confirmation: "123xyz") 
    end.should raise_error(ActiveModel::MassAssignmentSecurity::Error) 

    end 

我想不通,爲什麼我的測試的變體1失敗,但變種2通過。我得到的錯誤信息是:

1) User accessible attributes can not be set on create 
    Failure/Error: expect do 
     expected ActiveModel::MassAssignmentSecurity::Error but nothing was raised 

他們基本上是一樣的測試。我究竟做錯了什麼?事實上,如果我從控制檯執行測試1,它會按預期拋出MAS :: Error。我很困惑。

+0

爲什麼你寫的'讓(:new_user){FactoryGirl .create(:user)}'並且從不使用'new_user'方法?如果你需要一個管理員,你可以在'FactoryGirl.create'中傳遞'admin:true',甚至通過擴展'user'的工廠爲管理員創建單獨的工廠(參見文檔https://github.com中的'parent'鍵/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#inheritance)。 – jdoe

+0

@jdoe,謝謝,我確實在其他地方使用'new_user'對象,感謝鏈接 – stephenmurdoch

回答

4

@admin_attrs可能是零,只要你的第一個文字的例子是擔心,因爲它沒有被設置在前面的勾(或通過「讓」)

+1

這是正確的。澄清--''''生成一個類,'它'生成(有效)一個實例方法。 '@ admin_attrs'在類級別聲明並且不可用於實例方法。 –

+0

謝謝你們,現在對我來說這很有意義。 – stephenmurdoch

相關問題