【问题标题】:Why can't I create user in spec?为什么我不能在规范中创建用户?
【发布时间】:2020-09-01 15:20:50
【问题描述】:

我的 RSpec 有问题,我的 request_spec /post 不断给我输出:

1) Users POST /users valid user  creates user properly
     Failure/Error: expect(json['title']).to eq("example@email.com")

       expected: "example@email.com"
            got: nil

       (compared using ==)
     # ./spec/requests/users_request_spec.rb:54:in `block (4 levels) in <main>'

  2) Users POST /users valid user  have http status 201
     Failure/Error: expect(response).to have_http_status(201)
       expected the response to have status code 201 but it was 422
     # ./spec/requests/users_request_spec.rb:59:in `block (4 levels) in <main>'

  3) Users POST /users invalid user  return failure message
     Failure/Error: @user = User.create!(user_params)

     ActiveRecord::RecordInvalid:
       Validation failed: Password can't be blank, Password is too short (minimum is 5 characters), Email can't be blank, Email is invalid, Email has already been taken, Password confirmation can't be blank

我的规格是:

describe 'POST /users' do
        let(:valid_params) { { email: 'example@email.com', password: '12345678', password_confirmation: '12345678', name: 'Derek' } }


        context 'valid user ' do
            before { post "/users", params: valid_params }

            it 'creates user properly' do
                puts user.errors.size
                expect(json['title']).to eq("example@email.com")
                expect(json).not_to be_empty
            end

            it 'have http status 201' do
                expect(response).to have_http_status(201)
            end
        end

        context 'invalid user ' do
            before { post "/users", params: { } }

            it 'return failure message' do
                expect(response.body).to match(/Email can't be blanc/)
            end

        end
    end

和控制器:

def create
        # @user.id = current_user.id
        @user = User.create!(user_params)

        respond_to do |format|
            if @user.save
                format.json { render json: @user, status: :created }
            else
                format.json { render json: @user.errors, status: :unprocessable_entity }
            end
        end
    end

我认为这是用户参数的问题:

def user_params
        params.permit(:email, :password, :password_confirmation, :name)
    end

我添加了 require(:user) 到它,但后来我收到错误“参数丢失或值为空用户”。我受不了了,请帮帮我。

【问题讨论】:

  • 根据您的表单外观,参数如下所示:params = { user: { name: "Derek, email: "..." } }。因此,例如,如果您使用 form_for 。检查你的rails s的日志,你会看到它是否嵌套。
  • 提交的数据和预期的数据也可能不匹配:您提交了email 字段,但您的测试正在寻找title 字段。
  • 其实我用的是api_only,所以我跳过了所有视图

标签: ruby-on-rails ruby rspec


【解决方案1】:

保留require(:user) 并更改规范中的valid_params,如下所示:

let(:valid_params) { {user: { email: 'example@email.com', password: '12345678', password_confirmation: '12345678', name: 'Derek'}} } 

【讨论】:

    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多