0

rspec を使用して CSV アップローダをテストしています。テスト ファイルを /spec/fixtures に保存し、fixture_file_upload を使用してテストに取り込みます。

let(:file) do
  fixture_file_upload(
    Rails.root.join("spec/fixtures/chargeback_test.csv"),
    "text/csv"
  )
end

これは機能しますが、各仕様にファイルパスがあります。これをファクトリに配置してコードを DRY アウトしたいのですが、FactoryGirl に Tempfile が必要であることを理解させるのに苦労していFactoryGirl.create(:chargeback_csv)ます。

工場は次のようになるはずだと思いました。

include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :chargeback_csv, :class => "Tempfile" do
    ignore do
      path      { Rails.root.join("spec/fixtures/chargeback_test.csv") }
      mime_type { "text/csv" }
      binary    { false }
    end

    initialize_with { fixture_file_upload(path, mime_type, binary) }

  end
end

しかし、私の仕様でこれを使用すると、次のエラーが発生します。

Failure/Error: let(:file) { FactoryGirl.create(:chargeback_csv) }
NoMethodError:
  undefined method `save!' for #<Tempfile:0x112fec730>

解決しました!このsave!エラーは、FactoryGirl がto_create作成した新しいオブジェクトを呼び出すために発生します。FactoryGirl の新しいバージョンには、skip_createこのエラーを回避するオプションがあります。私は古いバージョンを使用しているためto_create {}、工場に追加したところ、すべてのテストが再び緑色になりました。

include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :chargeback_csv, :class => "Tempfile" do

    to_create {}

    ignore do
      path      { Rails.root.join("spec/fixtures/chargeback_test.csv") }
      mime_type { "text/csv" }
      binary    { false }
    end

    initialize_with { fixture_file_upload(path, mime_type, binary) }

  end
end
4

1 に答える 1

2

https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#custom-constructionをご覧ください。今すぐ実行する必要がありますが、まだ解決していない場合は、数時間以内に状況の詳細でこの回答を更新します.

于 2013-09-17T15:35:06.090 に答える