ruby-on-rails rspec API数据和文件上载

xjreopfe  于 2023-02-26  发布在  Ruby
关注(0)|答案(1)|浏览(115)

我想为后API创建RSpec用例。其中数据(JSON格式+ pdf文件)以表单形式传递。例如

curl --location --request POST 'http://localhost:3000/api/v1/books' \
        --header 'Accept: application/json' \
        --header 'Authorization: Bearer eyJra...' \
        --form 'book="{ \"book\":  {
                \"info\":{
                    \"reference_id\": \"43999\"
                }                                                      
        }
        }"' \
        --form 'book_content=@"/home/bookcontent.pdf"' \
        --form 'book_booksummery=@"/home/booksummery.pdf"'

同样的,我也可以从postman创建。2我怎样才能在rspec中创建同样的表单数据,而在params中创建附件呢?3我试过了,但是控制器无法接收params。

it 'updates inquiry' do
            post '/api/v1/books', params: book="{ \"book\":  {
                \"info\":{
                    \"reference_id\": \"43999\"
                }                                                      
        }
        }".merge(book_content: fixture_file_upload('spec/fixtures/files/book_content.pdf', 'application/pdf'))
          .merge(book_booksummery: fixture_file_upload('spec/fixtures/files/book_booksummery.pdf', 'application/pdf'))
          , headers: headers_data
            
            Rails.logger.info response
            expect(response).to have_http_status(201)   # giving 422 status error code
            expect(json['reference_id']).to eq '43999'
          end
2sbarzqh

2sbarzqh1#

下面的方法很有效,只挑选关键项。基本上,你可以坚持使用散列。
我正在使用authenticated_header,您可能会发现这很方便(灵感就在这里)

@attached_file = Rack::Test::UploadedFile.new('spec/fixtures/files/book_content.pdf')

        post "/api/v1/books",
          headers: authenticated_header(@user_1),
          params: {
            book: {
              info: '123123123',
              book_content: @attached_file
            }
          }

我猜你的控制器看起来像这样

params.require(:book).permit(:info, :book_content)

相关问题