Rails 已连接 Active Storage?正确,但不在 rspec 异常中
Rails ActiveStorage is attached? true, but not in rspec expection
我想测试一个附加图像的动作。我使用 rSpec 请求规范。
实际请求中附加了图像,但 rspec 失败了 为什么?
def update_logo
if params[:logo].present?
image = params[:logo]
if image && @current_user.logo.attach(image)
puts @current_user.logo.attached? # !!! results in TRUE !!!
render json: @current_user, status: :ok
end
end
end
it "attaches a logo" do
post update_logo_url,
params: { logo: fixture_file_upload(file_fixture('400x400.png'), 'image/png') },
headers: { "Authorization" => token_generator(user.id) }
expect(user.logo).to be_attached
end
expected `#<ActiveStorage::Attached::One:0x00007fb9f57a90e8 @name="logo", @record=#<User id: 1, name: "....210787000 +0000">>.attached?` to be truthy, got false
顺便说一句:
其他测试如 ActiveStorage::Attachment.count 有效
所以,这是“绿色”:
it 'saves the uploaded file' do
expect {
subject
}.to change(ActiveStorage::Attachment, :count).by(1)
end
在检查附件之前尝试重新加载 user
实例:
expect(user.reload.logo).to be_attached
# ----------^^^^^^
您在发出请求之前将 user
从数据库中拉出。然后控制器方法将创建自己的实例、添加附件并保存所有内容。但是你测试中的 user
不会知道这些。如果您 user.reload
,user
将刷新为数据库中的最新信息,并且应附上 user.logo
。
我想测试一个附加图像的动作。我使用 rSpec 请求规范。 实际请求中附加了图像,但 rspec 失败了 为什么?
def update_logo
if params[:logo].present?
image = params[:logo]
if image && @current_user.logo.attach(image)
puts @current_user.logo.attached? # !!! results in TRUE !!!
render json: @current_user, status: :ok
end
end
end
it "attaches a logo" do
post update_logo_url,
params: { logo: fixture_file_upload(file_fixture('400x400.png'), 'image/png') },
headers: { "Authorization" => token_generator(user.id) }
expect(user.logo).to be_attached
end
expected `#<ActiveStorage::Attached::One:0x00007fb9f57a90e8 @name="logo", @record=#<User id: 1, name: "....210787000 +0000">>.attached?` to be truthy, got false
顺便说一句:
其他测试如 ActiveStorage::Attachment.count 有效 所以,这是“绿色”:
it 'saves the uploaded file' do
expect {
subject
}.to change(ActiveStorage::Attachment, :count).by(1)
end
在检查附件之前尝试重新加载 user
实例:
expect(user.reload.logo).to be_attached
# ----------^^^^^^
您在发出请求之前将 user
从数据库中拉出。然后控制器方法将创建自己的实例、添加附件并保存所有内容。但是你测试中的 user
不会知道这些。如果您 user.reload
,user
将刷新为数据库中的最新信息,并且应附上 user.logo
。