使用 RSpec 上传的图像在控制器上出现意外 class

Upload image with RSpec has unexpected class on controller

根据 post 请求,我在 RSpec 和 fixture_file_upload 方面遇到了麻烦。

问题是:我试图通过上传发送图像以创建带有图像的类别,但是当图像到达时,它改变了它的 class 类型。

我正在等待进入 params[:category][:image]ActionDispatch::Http::UploadedFile,但我收到的是 ActionController::Parameters

我的请求示例:

    context 'when creates a new main category with valid params' do
      let(:category) do
        { category: { name: 'Bolos E bolos',
                      description: 'São bolos sim',
                      locale: 'pt-BR',
                      image: fixture_file_upload('images/test-image.png', 'image/png') } }
      end

      post '/v4/categories' do
        it 'upload image' do
          expect { do_request(category) }.to change { ActiveStorage::Blob.count }.from(0).to(1)
        end
      end
    end

我得到了什么:

Failure/Error: expect { do_request(category) }.to change { ActiveStorage::Blob.count }.by(1)
       expected `ActiveStorage::Blob.count` to have changed by 1, but was changed by 0 

如何将图像作为上传发送并在控制器上作为 ActionDispatch::Http::UploadedFile 而不是 ActionController::Parameters

获取它

我无法使您的控制器规范正常工作,但我设法使等效的请求规范正常工作。花了 45 分钟以上却一无所获,我认为这是我能做的最好的了。这似乎有效。 (只需确保 rails 应用程序的 public 文件夹中有一个 avatar.jpg。)

## spec/requests/user_spec.rb
require 'rails_helper'

RSpec.describe "Users", type: :request do

  describe "it attaches uploaded files" do
    it 'attaches the uploaded file' do
      file = fixture_file_upload(Rails.root.join('public', 'avatar.jpg'), 'image/jpg')
      expect {
        post api_users_path, params: { user: {username: "Ben", avatar: file } }
      }.to change(ActiveStorage::Attachment, :count).by(1)
    end
  end
end