2012-05-11 45 views
6

我正在嘗試使用Rspec測試「創建後」操作。代碼如下:使用Rspec測試「創建後」

def valid_attributes 
    { 
    :zone => Flymgr::Zone.new(:countries => Flymgr::ZoneCountry.first, 
     :name => 'USA', 
     :description => 'USA Flight', 
     :zipcodes => ''), 
    :price => '100.00', 
    :class => 'first', 

    } 
    end 

    def valid_session 
    {} 
    end 

    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:admin] 
     admin = FactoryGirl.create(:admin) 
     sign_in admin       
     end 

describe "POST create" do 
    describe "with valid params" do 
     it "creates a new Flymgr::Rule" do 
     expect { 
      post :create, {:Flymgr_rule => valid_attributes} 
     }.to change(Flymgr::Rule, :count).by(1) 
     end 

一個用於形式所需的屬性是一個「區域」,這是一個下拉框和下拉選項與不同形式創建的。我不知道如何使用Rspec創建表單條目。正如你所看到的,我試圖從不同的控制器Flymgr::Zone.new調用一個方法。我不認爲這是行得通的,它正在打破我的考驗。

任何人都可以建議最好的方法來做到這一點?也許我應該使用FactoryGirl來創建區域和規則條目?

回答

5

你的請求參數散列有一個對象作爲zone的值,當你發佈它時只會'to_s'-ed,這不太可能是你想要的。

一般來說最好的做法是用工廠女孩建立自己的對象,並使用attributes_for策略,參數及其屬性的職位要求: What is the proper way to test 'create' controller actions?

你的問題是在暗示該組織是一個belong_to所以你只需要發佈一個ID。請注意,目前,FactoryGirl不會爲這些關聯創建任何屬性。如果您的規則定義的工廠需要的區域關聯的照顧,你可以使用此解決方法:

FactoryGirl.build(:flymgr_rule).attributes 

還包括zone_id但是,那麼你就需要排除不需要的PARAMS。 (「id」,「created_at」,「updated_at」等)。

所以,你可能會更好的顯式插入區域的params散列信息,就像你在有效的post請求中看到它一樣。

閱讀factorygirl屬性和關聯的主題: https://github.com/thoughtbot/factory_girl/issues/359

3

由於guide指出:

# Returns a hash of attributes that can be used to build a User instance 
attrs = FactoryGirl.attributes_for(:user)