1

私のモデルでは、editorial_assetテーブルに保存されたアセットを選択する必要があります。

include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :editorial_asset do
    editorial_asset { fixture_file_upload("#{Rails.root}/spec/fixtures/files/fakeUp.png", "image/png") }
  end
end

だから私は自分のモデル工場に関連付けを付けました:editorial_asset

アップロードはうまく機能しますが、時間がかかりすぎます (例ごとに 1 秒)

各例の前に一度アップロードを作成し、工場で「作成する代わりに検索」と言うことが可能かどうか疑問に思っています

しかし、database_cleaner の問題は、テーブルを除外できず:transaction、切り捨てに 40 ミリ秒ではなく 25 秒かかります。

編集

資産が必要な工場

FactoryGirl.define do
  factory :actu do
    sequence(:title) {|n| "Actu #{n}"}
    sequence(:subtitle) {|n| "Sous-sitre #{n}"}

    body Lipsum.paragraphs[3]

    # Associations
    user
    # editorial_asset
  end
end

モデルスペック

require 'spec_helper'

describe Actu do
  before(:all) do
    @asset = create(:editorial_asset)
  end

  after(:all) do
    EditorialAsset.destroy_all
  end

  it "has a valid factory" do
    create(:actu).should be_valid
  end

end

したがって、作業方法は

  it "has a valid factory" do
    create(:actu, editorial_asset: @asset).should be_valid
  end

しかし、関連付けを自動的に注入する方法はありませんか?

4

1 に答える 1

1

RSpec を使用しているため、before(:all)ブロックを使用してこれらのレコードを一度設定できます。ただし、before-all ブロッ​​クで行われたことはトランザクションの一部とは見なされないため、after-all ブロッ​​クで自分で DB から何かを削除する必要があります。

エディトリアル アセットに関連付けられているモデルのファクトリは、作成する前に最初に 1 つを見つけようとすることができます。あなたができるようなことをする代わりにassociation :editorial_asset

editorial_asset { EditorialAsset.first || Factory.create(:editorial_asset) }

rspec テストは次のようになります。

before(:all) do
    @editorial = Factory.create :editorial_asset
end

after(:all) do
    EditorialAsset.destroy_all
end

it "already has an editorial asset." do
    model = Factory.create :model_with_editorial_asset
    model.editorial_asset.should == @editorial
end

Rspec GitHub wiki ページまたは Relish ドキュメントで before と after ブロックの詳細を参照してください。

https://github.com/rspec/rspec-rails

https://www.relishapp.com/rspec

于 2012-05-31T14:02:20.720 に答える