0

「ライブ」、「使用済み」、「オフライン」などのいくつかのイベントタイプを持つ event_type モデルがあるとします。

これらの型は、Event と呼ばれる別のモデルで使用されます。ここで、テストするときは、すべての実行ですべてのタイプを設定する必要があります。具体的には、これが私のイベント ファクトリです。

factory :event do |e|
    e.event_type {|v| v.association(:event_type)}
    e.latitude 40.767929000000
    e.longitude -73.985742000000
end

イベントファクトリーでこれを試しました:

after(:create) {|event|
  FactoryGirl.create(:event_type, {:name => "live"})
  FactoryGirl.create(:event_type, {:name => "used"})
  FactoryGirl.create(:event_type, {:name => "offline"})
}

このアプローチの問題は、複数のイベント オブジェクトを作成すると、使用するイベントごとにすべてのイベント タイプが再度作成されることです。

より良いアプローチは何でしょうか?

ありがとう、

4

2 に答える 2

1

テストを実行している _spec でこれを行う必要があります。(またはテスト)

RSpec では、spec の先頭にある before ブロックでこれを行います。

require 'spec_helper'

describe Event do 

  before do 
    FactoryGirl.create(:event_type, {:name => "live"})
    FactoryGirl.create(:event_type, {:name => "used"})
    FactoryGirl.create(:event_type, {:name => "offline"}) 
  end

  it "tests something" do 
    ...
  end 
end

また、おそらく Trait が作成された目的を実行しようとしています...だから、あなたの Factory で

factory :event do |e|

  e.latitude 40.767929000000
  e.longitude -73.985742000000

  trait :live
    e.event_type = "live"
  end

  trait :used
    e.event_type = "used"
  end

  trait :offline
    e.event_type = "offline"
  end

  # defining these is not necessary but may save you some time
  factory :event_live, traits: [:live]
  factory :event_used, traits: [:used]
  factory :event_offline, traits: [:offline]
end

これにより、それらに基づいてファクトリを作成できるようになります。

FactoryGirl.create :event, :live

または、上記の「不要な工場」を呼び出すことができます

FactoryGirl.create :event_live

ただし、 event_type が関連付けの場合、次のように活用できる別のファクトリで特性を定義する必要がある場合があります。

trait :live do 
  e.association :event_type, factory: :event_type
end

お役に立てれば!

固有の検証エラーが発生しないように、 Database Cleaner gem を利用して実行ごとにアイテムを消去することもできます。

于 2013-09-24T20:16:08.737 に答える
0

1 つの解決策は、値をテスト データベースに直接入力することです。トランザクション フィクスチャ (spec_helper で config.use_transactional_fixtures = true) を使用している場合、誤って削除されることを心配する必要はありません。フィクスチャに入れておけば、紛失しても簡単に再インポートできます。

于 2013-09-24T19:40:19.223 に答える