我正在测试一个带有rspec的CSV上传器,我已经在/ spec / fixtures中保存了一个测试文件,我用fixture_file_upload进入测试:
let(:file) do
fixture_file_upload(
Rails.root.join("spec/fixtures/chargeback_test.csv"),
"text/csv"
)
end
这有效但我在每个规范中都有文件路径。我想通过把它放在一个工厂来干掉我的代码,但是我无法让FactoryGirl明白我想从FactoryGirl.create(:chargeback_csv)
回来一个Tempfile。
我猜我的工厂应该是这样的:
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
答案 0 :(得分:2)
结帐https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#custom-construction。我现在需要运行,但如果你还没有弄明白的话,我会在几个小时内根据你的具体情况更新这个答案。