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

这可行,但我在每个规范中都有文件路径。我想通过将其放入工厂来干燥我的代码,但我无法让 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
4

1 回答 1

2

查看https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#custom-construction。我现在需要运行,但如果您还没有弄清楚,我会在几个小时内根据您的具体情况更新此答案。

于 2013-09-17T15:35:06.090 回答