Rspec rails 比较上传的文件 md5 哈希



我需要检查上传后文件是否已更改(占位符徽标被真实徽标替换,所以我不能只使用 file.present?

我有一个代码将在真实文件上运行 md5 哈希,但是我在从 rspec 测试访问此文件时遇到问题。

RSpec 在测试期间将文件放在哪里?假设我有一个模型

mount_uploader :logo

在我的规格中,我正在尝试做

it 'updates with a real logo' do
  logo_absolute_path = File.join(Rails.root, model.logo.url)
  expect { request }.to change_file(clean_path)
end

File.join(Rails.root, model.logo.url)提出了以下几点

没有这样的文件或目录@ rb_sysopen -/Users/Me/dev/example/uploads/model/5ad86444aba9cf23416700f0/logo.png

所以我猜这不是在测试模式下存储文件的地方。任何人都可以告诉我如何生成本地绝对文件路径以测试测试环境中的内容?

注意:expect { request }.to change_file(clean_path)是基于 https://gist.github.com/mattwynne/736421 的匹配器

编辑我的匹配器的代码,因为它可能很重要:

RSpec::Matchers.define(:change_file) do |file_path|
  supports_block_expectations
  match do |procedure|
    before_hash = md5_hash(file_path)
    procedure.call
    after_hash = md5_hash(file_path)
    expect(before_hash).not_to eq(after_hash)
  end
  def md5_hash(file_path)
    Digest::MD5.hexdigest(File.read(file_path))
  end
end

为了在测试中获取路径,在创建 Object 的新实例后,我调用:

Object.mounted_as.file.path

所以在你的情况下,它会是:

it 'updates with a real logo' do
  logo_absolute_path = model.logo.file.path      
  expect { request }.to change_file(clean_path)
end

另外,请确保您已为model设置了logo(例如,使用FactoryBot(。

载波在哪里存储文件?

就我而言,上传器类为以下store_dir方法:

def store_dir
  "#{UPLOADS_PATH}/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

UPLOADS_PATH在哪里:

UPLOADS_PATH = "#{Rails.root.to_s}/private/uploads/#{Rails.env}"

因此,就我而言,测试文件位于:

/APP_ROOT/private/uploads/test/MODEL/MOUNDED_AS/OBJECT_ID/FILE_NAME

最新更新