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