Почему Accept: application / json и Content-Type: application / json вызывают проблемы в этом тесте? - PullRequest
1 голос
/ 24 марта 2019

У меня есть следующий тест:

require 'rails_helper'

  RSpec.describe 'User management', :type => :request do
    before do
      @expected_number_of_users = 3
    end

    context 'an authenticated user with admin privileges' do
      before do
        # This username/password combo is in my fixtures
        @headers = login_user 'scottj', '123456'
      end

      context 'when at least a username, name, role, and email address are passed as inputs' do
        before do
          @new_user_details = {
            :username => 'stitch',
            :name => 'Stitch',
            :role => :admin,
            :email => 'stitch@disney.com'
          }
        end

        it 'should create a new user' do
          post users_path, headers: @headers, params: @new_user_details
          expect(response).to have_http_status(:ok)

          expect(json.username).to eq('stitch')
          expect(json.name).to eq('Stitch')
          expect(json.role).to eq(:admin.to_s)
          expect(json.email).to eq('stitch@disney.com')
          expect(json.password).to_not be_nil
        end
      end
    end
  end

Со следующим login_support.rb файлом:

module LoginSupport
  def json_api_headers
    {
      "Content-Type": 'application/json',
      "Accept": 'application/json'
    }
  end

  def login_user(username, password)
    combined_login_password = username + ":" + password
    encoded_username_password = Base64.encode64(combined_login_password)
    headers = {
      'X-Api-Key': Client.find_by_id(1234).api_key,
      'Authorization': 'Basic ' + encoded_username_password
    }.merge(json_api_headers)

    post '/login', headers: headers

    user = JSON.parse(response.body, object_class: OpenStruct)

    {
      'Authorization': 'Bearer ' + user.auth_token
    }
  end
end

Этот тест проходит, как и ожидалось, но когда я изменяю тип возвращаемого значения login_user на (то есть меняем последние три строки этой функции):

{
  'Authorization': 'Bearer ' + user.auth_token
}.merge(json_api_headers)

Теперь, когда я запускаю тест, я получаю ошибку:

ActionDispatch::ParamsParser::ParseError: 765: unexpected token at 'username=stitch&name=Stitch&role=admin&email=jaywir3%40gmail.com'

Мне кажется, что более правильная версия заголовков, поскольку мой API ожидает получить тело запроса POST в форме JSON, а также возвращает JSON, с этими заголовками на месте. Мне кажется, что запрос POST с указанными заголовками пытается передать тело запроса в качестве параметров запроса.

Есть ли что-то, что я делаю не так? Должен ли я просто оставить заголовки Accept и Content-Type в моих запросах при тестировании?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...