2016-12-08 7 views
0

"親子関係"または関連で2つのモデルクラスがあります。RSPECで子モデルをテストし、エラーが未定義のメソッドIDを取得する

organizationsは、属性がid, organization_name, created_at and updated_atの親テーブル/モデルです。

eventsは、属性がid, event_description, host_name, created_at, updated_at and organization_idの子テーブル/モデルです。

組織およびイベント・レコードとの間の関連付けはevents.organization_id = organizations.idある、又はとしては、モデルクラスに指定されている:organizationsモデルとorganizationsコントローラの

class Event < ApplicationRecord 
... 
    belongs_to :organization 
... 
end 

class Organization < ApplicationRecord 
... 
    has_many :events, :dependent => :destroy 
... 
end 

テストがエラーなしで実行されます。 eventsコントローラのテストはまだビルドされていません。 アプリは完全に機能し、エラーなく動作しています。

問題は、私がイベントモデルテストを合格させることができないことです。

ここに私のコードです。

factories/organizations

FactoryGirl.define do 
    factory :organization do 
    organization_name { Faker::Company.name } 
    end 
    factory :invalid_organization, class: Organization do 
    organization_name '' 
    end 
end 

factories/events

FactoryGirl.define do 
    factory :event do 
    event_description { Faker::Lorem.sentence(3) } 
    host_name { Faker::Internet.domain_name } 
    organization = build(:organization) 
    organization_id = organization.id 
    end 
end 

私が最初に組織を作成し、作成される新しいeventorganization_id属性のidを使用しようとしています。

そして、これはevent_spec.rb

require 'rails_helper' 

RSpec.describe Event, type: :model do 
    it "has a valid factory" do 
    event = build(:event) 
    expect(event).to be_valid 
    end 
    it { is_expected.to validate_presence_of(:event_description) } 
    it { is_expected.to validate_presence_of(:host_name) } 
    it { is_expected.to validate_presence_of(:organization_id) } 
    it { is_expected.to belong_to(:organization) } 
end 

ファイルである基本的に私は、最初のorganizationを作成して、私が作成していますeventときorganization_idに割り当てられるように、このidを使用します。テストrspec spec/models/event_spec.rbを実行している場合は

私はこのエラーを取得しています:

/Users/levi/ror/events-handler/spec/factories/events.rb:6:in `block (2 levels) in <top (required)>': undefined method `id' for #<FactoryGirl::Declaration::Static:0x007febc03db798> (NoMethodError) 

はそれを修正する方法や、より良いテストを書く方法を知っていますか?

答えて

0

私はあなたのevent工場は少し違って見えるべきだと思う:ORGANIZATION_ID:

FactoryGirl.define do 
    factory :event do 
    event_description { Faker::Lorem.sentence(3) } 
    host_name { Faker::Internet.domain_name } 
    organization { build(:organization) } 
    end 
end 
+0

当初、私はこのエラーましゼロ>有効なものにするのが、エラーを得た:組織は空白にすることはできません。このエラーを取り除くために、私は組織のファクトリで次の行を追加しました:id {Faker :: Number.number(5)}その後、テストは正常に成功しました。どうもありがとう! –

+0

あなたは 'organization'にランダムIDを設定すべきではありません。 – faron

+0

組織の工場からID生成を削除し、あなたのソリューションを{Building(:organization)}という行の組織をLine organization = FactoryGirl.create({})で置き換えるとき、より良いオプションは実際に '' :組織)、私はエラーが発生しています:/Users/levi/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/factory_girl-4.7.0/lib/factory_girl/registry。rb:24: 'find ':工場は登録されていません:organization(ArgumentError) –

関連する問題