首页 > 解决方案 > 如何使用 RSpec 测试 PUT/PATCH API

问题描述

我正在尝试从我的 API 测试一些 PUT/PATCH 端点,但我的“record_to_update”没有按预期进行。

我使用 Rails 5.2 和 RSpec 3.8 组织规范如下:

require 'rails_helper'

RSpec.describe UsersController, type: :controller do
  context 'when request with no valid headers' do
    ...
    ...
    ...
  end

  context 'when resquest with valid headers' do
    before do
      request.accept = 'application/vnd.api+json'
      request.content_type = 'application/vnd.api+json'

      2.times do
        create(:user)
      end
    end

    describe 'PATCH/PUT /users/:id' do
      let(:record_to_update) { create(:user) }
      let(:user_params) do
        { id: first_user.id, name: 'goku', email: 'goku@bol.com' }
      end

      before do
        put :update, params: { id: record_to_update, user: user_params }
        record_to_update.reload
      end

      it 'should update user' do
        expect(record_to_update.name).to eq('goku')
        expect(response.status).to eq 200
      end
    end
  end
end

正如我所说的,我在这里面临的问题是“record_to_update”没有更新。我已经用 Postman 在同一个 API 中测试了同一个 PUT/PATCH 端点,并从那里成功更新。我在这里做错了什么?

提前致谢。

标签: ruby-on-railsapirspec

解决方案


您应该将before块移动到it 'should update user'

  before do
    put :update, params: { id: record_to_update.id, user: user_params }

  end

所以它变成

it 'update user' do
  put :update, params: { id: record_to_update, user: user_params }
  expect ...
  record.reload!
....
end

推荐阅读