gpt4 book ai didi

ruby-on-rails - 如何在 RSpec 请求规范中模拟 ActiveStorage 上传

转载 作者:行者123 更新时间:2023-12-04 03:36:23 27 4
gpt4 key购买 nike

我正在编写一个仅 API 的 Rails 应用程序(rails 5.2),我需要使用 ActiveStorage。我想编写一个 RSpec 请求规范来确保文件上传正常工作,但这证明非常困难。到目前为止,这是我的规范:

RSpec.describe 'POST /profile/photos', type: :request do
let(:url) { '/profile/photos' }
let(:file) { fixture_file_upload('photo.jpg') }

before do
log_user_in

## Do a file upload ##
post '/rails/active_storage/direct_uploads', params: {
blob: {
filename: "woman.jpg",
content_type: "image/jpeg",
byte_size: File.size(file.path),
checksum: Digest::MD5.base64digest(File.read(file.path))
}
}

post url, params: {signed_id: json["signed_id"]}
end

it "Performs an upload" do
# Never gets here, error instead
end
end

我试过使用 put帮助在第一个和第二个之间上传文件 post调用 before步骤,但我一直遇到 422 个无法处理的实体错误,可能是因为 put helper 不支持设置原始请求正文。但我不完全确定那个 put 的格式应该是什么,或者是否有更好的方法来测试它。

我试过使用 fixture_file_upload ,如 this question 中所述:

put json["direct_upload"]["url"], params: {file: fixture_file_upload('photo.jpg')}

但是该请求像我所有其他尝试一样返回 422。我认为 direct_upload URL 确实希望请求的正文包含文件而不是其他任何内容。

我怀疑我的方法在这里有很多错误,但是如果您不使用开箱即用的 javascript 来隐藏大多数交互,那么 Rails 文档关于如何使用 ActiveStorage 的内容有些稀疏。

最佳答案

您可能不关心测试 Active Storage 引擎,因此您不需要 post '/rails/active_storage/direct_uploads' ,您只需要一个有效的签名。

我最终创建了一个 ActiveStorage::Blob手工,然后我可以要求它签名。在助手中这样的事情:

def blob_for(name)
ActiveStorage::Blob.create_after_upload!(
io: File.open(Rails.root.join(file_fixture(name)), 'rb'),
filename: name,
content_type: 'image/jpeg' # Or figure it out from `name` if you have non-JPEGs
)
end

然后在你的规范中你可以说:
post url, params: { signed_id: blob_for('photo.jpg').signed_id }

关于ruby-on-rails - 如何在 RSpec 请求规范中模拟 ActiveStorage 上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55885294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com