我正在使用 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)
.
我猜工厂应该是这样的:
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