【问题标题】:How can I replace a Tempfile with FactoryGirl?如何用 FactoryGirl 替换 Tempfile?
【发布时间】:2013-09-17 02:58:13
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: rspec factory-bot fixture


    【解决方案1】:

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

    【讨论】:

    • 我认为initialize_with 看起来很有希望。我仍然遇到这个问题,所以任何额外的帮助将不胜感激。我将用我正在尝试的最新工厂和遇到的错误来更新我的问题。
    • 知道了 :) 关于save! 的错误正在发生,因为to_create() 在工厂创建的对象上调用save!。较新版本的 FactoryGirl 有 skip_create 来处理这个问题,但我必须将 to_create 定义为一个空块才能使用我的版本。
    • 令人印象深刻的调查工作!你是怎么想出来的?此外,我对共享链接的阅读表明您不需要ignore 块,因为您引用了initialize_block 中的所有参数。您的方式可能更清晰,但我只是好奇您是否以这种方式阅读并想尝试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多