2012-05-14 4 views
16

私は、次のモデルを持っている:私は新しい要求を取得するたびにhas_and_belongs_to_manyリレーションのフィクスチャを設定するにはどうしたらいいですか?

class Company < ActiveRecord::Base 
    has_and_belongs_to_many :regions 

class Region < ActiveRecord::Base 
    has_many :requests 
    has_and_belongs_to_many :companies 

class RequestForProposals < ActiveRecord::Base 
    belongs_to :region 

、私は同じ地域に積極的に企業に通知を送信します。

適切な会社を見つけるロジックを単体テストできるように、これを自分の什器でどのように設定すればよいですか?

私はcompanies.ymlに

region_ids: 1, 2 
regions: one, two 

を試してみましたが、会社に領域を割り当てることでもない作品ました。ここで

は、生成されたSQLの要旨です:https://gist.github.com/2713518

答えて

28

は、レールの自動地域のIDを割り当てるようにする必要があります。これは、companies.ymlの前にregions.ymlを読み込まなくて済むようにするために、レールは会社の施設の名前から結合テーブルに貼り付けられたIDを計算するからです。 idsを自分で割り当てた場合は、計算されたものと一致しません。

あなたは1と2に地域のIDを設定しているように見える提供してきましたSQL、すなわちから、あなたのregions.ymlが

one: 
    id: 1 
    name: MyString 

を持っているがid:1を削除して、あなたは大丈夫でなければなりません。また、RailsはそれがためにIDにregion_idを設定することを意味知っているだろう

region: one 

region_id: 1 

を交換し、地域を参照してください。他のファイル(例えばrequest_for_proposals.yml)を更新する必要があります地域でラベルoneを使用してください。

0

私はこれらの日1つの使用YAMLフィクスチャをどうするかわからないんです。テスト中にdbオブジェクトインスタンスを作成するためにFactoryGirlを試しましたか?しかし、それは非常に洗練された方法で、灯具とほとんど同じです。

次の文章では、テストフレームワークとしてrspecを使用していることを前提としています。あなたのGemfilefactory_girl-rails含むとfactory_girlのREADMEに応じspec/spec_helper.rbを更新した後

、以下のファイルを作成します。

# spec/factories/company_factories.rb 
FactoryGirl.define do 
    factory :company do 
    title { |n| "Test Company #{n}" } 

    # whatever else fields 

    after_create { |company| company.regions << FactoryGirl.create(:region) } 
    end 
end 

# spec/factories/region_factories.rb 
FactoryGirl.define do 
    factory :region do 
    # whatever fields here 
    end 
end 

# spec/factories/request_factories.rb 
FactoryGirl.define do 
    factory :request do   
    # whatever fields here 
    end 
end 

今、本当の問題は - あなたがやっている実際のテストコードは何ですか?

0

あなたのregions.ymlはtest/fixturesディレクトリにありますか?どうですか?companies.yml?特定の会社のコード「地域:1つ、2つ」が機能するはずです。
Railsは、テストを実行すると、このディレクトリにあるフィクスチャを自動的にロードします。 場所が正しい場合は、テストを実行するときに、sql生成されたテスト出力を投稿してください。あなたの仕事に

companies.yml
regions: one, two 

については

+0

はここで生成されたSQLの要旨だします。https://gist.github .com/2713518 –

+0

はい、フィクスチャファイルはtest/fixturesディレクトリにあります –

-1

あなたが自分でこのIDを計算する必要がある場合は、受け入れられた回答に加えて、あなたには、いくつかの緩い参照または別のデータソースを持っているだけで追加します。あなたのtest_helper.rb

def fixh(key) 
    ActiveRecord::FixtureSet.identify key 
end 

をして、備品にこの方法を使用します。

security_context1: 
    ext_id: <%= fixh :user1 %> 
関連する問題