Rspec 如何用FactoryGirl替换临时文件?

Rspec 如何用FactoryGirl替换临时文件?,rspec,factory-bot,fixture,Rspec,Factory Bot,Fixture,我正在用rspec测试CSV上传程序,我在/spec/fixtures中保存了一个测试文件,我用fixture\u file\u upload将该文件拉入测试: let(:file) do fixture_file_upload( Rails.root.join("spec/fixtures/chargeback_test.csv"), "text/csv" ) end 这是可行的,但我在每个规范中都有文件路径。我想通过将其放入工厂来干燥我的代码,但我很难让Factor

我正在用rspec测试CSV上传程序,我在/spec/fixtures中保存了一个测试文件,我用fixture\u file\u upload将该文件拉入测试:

let(:file) do
  fixture_file_upload(
    Rails.root.join("spec/fixtures/chargeback_test.csv"),
    "text/csv"
  )
end
这是可行的,但我在每个规范中都有文件路径。我想通过将其放入工厂来干燥我的代码,但我很难让FactoryGirl明白我想要从
FactoryGirl.create(:chargeback\u 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>

退房。我现在需要运行,但如果您还没有弄明白,我会在几个小时内根据您的具体情况更新此答案。

我认为
初始化
看起来很有希望。我仍然有这个问题,所以任何额外的帮助将不胜感激。我要用我正在尝试的最新工厂和我得到的错误更新我的问题。明白了:)关于
保存的错误正在发生,因为
to_create()
调用
save。FactoryGirl的较新版本有
跳过创建
来处理这个问题,但我必须将
创建
定义为一个空块,以便与我的版本一起使用。令人印象深刻的调查工作!你怎么知道的?此外,我对共享链接的阅读表明,您不需要使用
忽略
块,因为您正在引用
初始化\u块中的所有参数。你的方式可能更清晰,但我只是好奇你是否这样理解并想尝试一下。
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