2012-05-11 12 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

あなたのリクエストパラメータハッシュは値のオブジェクトを持っています:ゾーン、あなたが投稿するときには、ちょうどあなたが望むことはありません。一般的なベストプラクティスに

は、あなたのオブジェクトを構築し、ポストの要求のためにその属性をパラメータ化するattributes_for戦略を使用するために、工場の女の子を使用することです:あなたの質問は関連があなたのようbelong_toであることを示唆している What is the proper way to test 'create' controller actions?

IDだけを投稿する必要があります。現在、FactoryGirlはアソシエーションのアトリビュートを作成していないことに注意してください。ルールのためのあなたのファクトリの定義は、ゾーン関連の世話をする場合は、この回避策を使用することができます。

FactoryGirl.build(:flymgr_rule).attributes 

もZONE_IDを含むようにしかし、あなたは不要なのparamsを除外する必要があります。 ( "id"、 "created_at"、 "updated_at"など)。

有効な投稿要求で表示されるように、ゾーンのparamsハッシュ情報を明示的に挿入する方がよい場合があります。

factorygirlの属性と関連にこのスレッドを読むguideとして https://github.com/thoughtbot/factory_girl/issues/359

3

は指摘:

# Returns a hash of attributes that can be used to build a User instance 
attrs = FactoryGirl.attributes_for(:user) 
関連する問題