"親子関係"または関連で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
私が最初に組織を作成し、作成される新しいevent
のorganization_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)
はそれを修正する方法や、より良いテストを書く方法を知っていますか?
当初、私はこのエラーましゼロ>有効なものにするのが、エラーを得た:組織は空白にすることはできません。このエラーを取り除くために、私は組織のファクトリで次の行を追加しました:id {Faker :: Number.number(5)}その後、テストは正常に成功しました。どうもありがとう! –
あなたは 'organization'にランダムIDを設定すべきではありません。 – faron
組織の工場から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) –