使用RSpec请求规范测试JSON API的最佳方法是什么?

时间:2017-02-10 08:27:05

标签: ruby-on-rails rspec

我发现使用RSpec请求规范测试JSON API很麻烦(参见下面的代码),因为我每次都必须创建所需的参数(valid_attributesinvalid_attributes并且让我困扰很多)我需要发送一个新请求。当我需要发送带有身份验证令牌的请求(另一个请求?)时,测试变得更加困难。

有更好的方法吗?

  describe 'POST /users' do
    # valid payload
    let(:valid_attributes) {
      {
        data: {
          attributes: { email: 'sample@mail.com', password: '1234' },
          type: 'user'
        }
      }
    }

    # invalid payload
    let(:invalid_attributes) {
      {
        data: {
          attributes: { email: '', password: '' },
          type: 'user'
        }
      }
    }

    context 'when the request is valid' do
      before { post '/users', params: valid_attributes }

      it 'creates a user' do
        expect(response).to have_http_status(201)
      end
    end

    context 'when the request is invalid' do
      before { post '/users', params: invalid_attributes }

      it 'create a user' do
        expect(response).to have_http_status(422)
      end
    end
  end

我用于测试的宝石,

group :test do
  gem 'rspec-rails', '~> 3.5'
  # Use Factory Girl for generating random test data
  gem 'factory_girl_rails', '~> 4.0'
  gem 'shoulda-matchers', '~> 3.1'
  gem 'faker'
  gem 'database_cleaner'
end

1 个答案:

答案 0 :(得分:1)

不确定你的想法,但我会删除这样的重复:

def user_with(email: '', password: '')
  {
    data: {
      attributes: { email: email, password: password },
      type: 'user'
    }
  }
end

# valid payload
let(:valid_attributes) { user_with(email: 'sample@mail.com', password: '1234') }

# invalid payload
let(:invalid_attributes) { user_with() }

如果您需要在多个规范文件中重复使用它,请在support目录中的某个文件中的模块或shared_context中移动它。