如何用FactoryGirl替换Tempfile?

时间:2013-09-17 02:58:13

标签: rspec factory-bot fixture

我正在测试一个带有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

1 个答案:

答案 0 :(得分:2)

结帐https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#custom-construction。我现在需要运行,但如果你还没有弄明白的话,我会在几个小时内根据你的具体情况更新这个答案。