Rspec、Paperclip 和 Rails - fixture_file_upload 的规格作为单独的,而不是成组的

Rspec, Paperclip and Rails - spec with fixture_file_upload works as single, not in group

我有一个规范,当 运行 单独通过时,但是当我 运行 它作为测试目录或我的整个套件的一部分时,它失败了。

规格

WebMock.disable!

describe MembersUpload::ParseSpreadsheet do

  let(:client) { create(:client) }
  let(:members_upload) { create(:members_upload, client: client) }

  context 'parsing an uploaded spreadsheet' do
    it 'should parse the spreadsheet and add rows' do
      MembersUpload::ParseSpreadsheet.call(client.id, members_upload.id)
      members_upload.reload
      expect(members_upload.spreadsheet_rows).to be > 0
    end
  end

end

工厂

FactoryGirl.define do  

  factory :members_upload do
    association :client
    ignore_duplicates false
    send_welcome_letters false
    spreadsheet_rows 0
    total_added 0
    invalid_percent 0
    disallowed_percent 0
    unknown_percent 0
    accept_all_percent 0
    invalid_violation false
    disallowed_violation false
    status 'scheduled'
    approved false
    approve_by Date.today + 14.days
    approval_type 'client'
    spreadsheet { fixture_file_upload "#{Rails.root}/spec/fixtures/member_uploads/members-uploads-samples-good.csv", 'text/csv' }
  end
end

当 运行 作为套件或一组测试的一部分时,我收到以下错误:
NoMethodError: undefined method body for nil:NilClass

错误本身指向一个名为 copy_to_local_filefog 方法,似乎表明它无法加载 file/file 的内容。

我觉得好像我一定遗漏了一些明显的东西,为什么这个测试会自己通过,而不是作为 suite/group 的一部分。

我是 Rspec 的新手,因为它涉及到 to/handles 上传的文件,我不知道从哪里开始(我用谷歌搜索了这个但发现很少)。

我认为你提到的 copy_to_local_file 是当回形针试图使用 for 与 S3 交谈时。这在生产环境中很好,但可能不是您在测试中想要的。

如果您将 Fog.mock = true 添加到您的测试设置中,它将在本地创建一个模拟版本的 S3,可以对其进行操作。然后您可以在您的测试设置中保存关联模型的副本(它将在内存中实例化此 "file"),然后它应该是您可以读回的内容。

希望对您有所帮助!