Rspec rails 比较上传文件的md5 hash
Rspec rails compare uploaded files md5 hash
我需要检查上传后文件是否已更改(占位符徽标已替换为真实徽标,所以我不能只使用 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)
提出以下
No such file or directory @ 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.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
(例如,使用 FactoryBot)设置 logo
。
carrierwave 在哪里存储文件?
在我的例子中,上传者 class 以下 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.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)
提出以下
No such file or directory @ 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.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
(例如,使用 FactoryBot)设置 logo
。
carrierwave 在哪里存储文件?
在我的例子中,上传者 class 以下 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