【问题标题】:Rspec rails compare uploaded files md5 hashRspec rails 比较上传的文件 md5 哈希
【发布时间】:2018-04-19 09:50:11
【问题描述】:

我需要检查上传后文件是否已更改(占位符徽标已替换为真实徽标,所以我不能只使用 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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 carrierwave rspec-rails rspec3


    【解决方案1】:

    为了获取测试中的路径,在创建了一个新的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)。

    carrierwave 在哪里存储文件?

    在我的例子中,上传器类有以下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
    

    【讨论】:

    • 嘿,感谢.file.path 的技巧,使代码更简洁,但是我仍然遇到No such file or directory @ rb_sysopen - /Users/Me/dev/my_app/public/uploads/model/5ad89ad5aba9cf39e25b654f/logo.png 之类的错误。如果我在测试过程中byebug,我确实可以使用另一个终端打开徽标,所以文件肯定在那里......
    • 哦我知道了,我的matcher其实是块期望匹配器,是不是调用proc后对象被销毁了……?我将编辑问题以添加我的匹配器
    • 你可以在读取/打开文件之前使用'pry' gem 并输入binding.pry 吗?然后,规范执行将停止,您将能够在测试期间检查文件是否存在。
    • 我的错,我上传的新文件的扩展名与第一个不同,所以该文件当然不再存在 =_=。谢谢,我会接受您的回答,因为我担心的是文件路径
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2021-09-27
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    相关资源
    最近更新 更多