【问题标题】:Rspec: Failure/Error: expect(assigns(:user)).to be_persistedRspec:失败/错误:expect(assigns(:user)).to be_persisted
【发布时间】:2015-10-07 12:21:07
【问题描述】:

我有一个简单的控制器 Rspec 测试。我正在测试用户控制器创建操作。

但我收到此错误

$ rspec spec/controllers/users_controller_spec.rb
.....F

Failures:

  1) UsersController POST #create user created
     Failure/Error: expect(assigns(:user)).to be_persisted
       expected `#<User id: nil, username: "username27", email: "user27@factory.com", created_at: nil, updated_at: nil, password_digest: nil, remember_digest: nil, admin: false, activation_digest: nil, activated: false, activated_at: nil, reset_digest: nil, >: nil, reset_sent_at: nil, avatar_file_name: nil, avatar_content_type: nil, avatar_file_size: nil, avatar_updated_at: nil, description: nil, header_image_file_name: nil, header_image_content_type: nil, header_image_file_size: nil, header_image_updated_at: nil>.persisted?` to return true, got false
     # ./spec/controllers/users_controller_spec.rb:58:in `block (3 levels) in <top (required)>'

Finished in 0.49926 seconds (files took 2.6 seconds to load)

这是测试

require "rails_helper"

RSpec.describe UsersController, type: :controller do
  let!(:admin) { create(:user, password: "Password123", admin: true) }
  let!(:user) { create(:user, password: "Password456", admin: false) }

  let!(:users) do
    [admin, user] + 3.times.map { create(:user) }
  end

  let!(:user_params) { user.attributes }

  describe "POST #create" do
    before do
      post :create, user: user_params
    end

    it "user created" do
      expect(assigns(:user)).to be_persisted
    end
  end
end

当我在创建操作中添加 binding.pry 时。然后运行 ​​User.new(user_params).valid? = 假

$ rspec spec/controllers/users_controller_spec.rb
.....
From: /Users/joseph/Documents/Safsy/Website/Safsy/Safsy/app/controllers/users_controller.rb @ line 26 UsersController#create:

    24: def create
    25:   @user = User.new(user_params)
 => 26:   binding.pry
    27:   if @user.save
    28:     @user.send_activation_email
    29:     flash[:info] = "Please check your email to activate your account."
    30:     redirect_to root_url
    31:   else
    32:     render 'new'
    33:   end
    34: end

[1] pry(#<UsersController>)> User.new(user_params)
=> #<User:0x007fa749fc1b18
 id: nil,
 username: "username27",
 email: "user27@factory.com",
 created_at: nil,
 updated_at: nil,
 password_digest: nil,
 remember_digest: nil,
 admin: false,
 activation_digest: nil,
 activated: false,
 activated_at: nil,
 reset_digest: nil,
 >: nil,
 reset_sent_at: nil,
 avatar_file_name: nil,
 avatar_content_type: nil,
 avatar_file_size: nil,
 avatar_updated_at: nil,
 description: "Vel aperiam et dolorem aliquid est perspiciatis.",
 header_image_file_name: nil,
 header_image_content_type: nil,
 header_image_file_size: nil,
 header_image_updated_at: nil>

任何线索如何解决它?就像我在测试中的 user_params 的一些属性也通过了创建操作

Here are is a binding.pry at the Test

    50:   end
    51:
    52:   describe "POST #create" do
    53:     before do
    54:       post :create, user: user_params
 => 55:       binding.pry
    56:     end
    57:
    58:     it "user created" do
    59:       expect(assigns(:user)).to be_persisted
    60:     end

[1] pry(#<RSpec::ExampleGroups::UsersController::POSTCreate>)> user_params
=> {"id"=>2,
 "username"=>"username27",
 "email"=>"user27@factory.com",
 "created_at"=>Wed, 07 Oct 2015 12:24:01 UTC +00:00,
 "updated_at"=>Wed, 07 Oct 2015 12:24:01 UTC +00:00,
 "password_digest"=>"$2a$04$Y627EwOml9cix7NdPITnpem0nZV8fta.JNyuezRsLNF2ucKfdC3GC",
 "remember_digest"=>nil,
 "admin"=>false,
 "activation_digest"=>"$2a$04$LHRBD82Lm0bj20nrwHDVveVlUa7zWq0WYIlmTMivT1h9UIcjwv9FO",
 "activated"=>true,
 "activated_at"=>nil,
 "reset_digest"=>nil,
 ">"=>nil,
 "reset_sent_at"=>nil,
 "avatar_file_name"=>nil,
 "avatar_content_type"=>nil,
 "avatar_file_size"=>nil,
 "avatar_updated_at"=>nil,
 "description"=>"Nihil eligendi ab debitis iure.",
 "header_image_file_name"=>nil,
 "header_image_content_type"=>nil,
 "header_image_file_size"=>nil,
 "header_image_updated_at"=>nil}

在测试中查看此处的 user_params,然后在创建操作中查看它们。他们是一样的。只是密码和密码确认等一些属性没有通过。

【问题讨论】:

  • 您是否检查过您从中获取 user_params 的用户是否已保留?您是否将控制器中的参数列入白名单?您不是只将电子邮件、用户名、描述和密码列入白名单吗?
  • 在您的模型或数据库中,您是否检查 :password 存在?如果是这样,没有它就会失败

标签: ruby-on-rails ruby rspec


【解决方案1】:

像下面这样修改你的规格,它应该可以工作 -

require "rails_helper"

RSpec.describe UsersController, type: :controller do
  let!(:admin) { create(:user, password: "Password123", admin: true) }
  let!(:user) { create(:user, password: "Password456", admin: false) }

  let!(:users) do
    [admin, user] + 3.times.map { create(:user) }
  end

  let!(:user_params) { user.dup.attributes }

  describe "POST #create" do
    it "user created" do
      valid_user_params = { username: "username#{rand(1000)}", 
       email: "user#{rand(1000)}@factory.com",
       password: "Password123",
       password_confirmation: "Password123",
       admin: false,
       description: "Nihil eligendi ab debitis iure." }
      post :create, user: valid_user_params
      expect(assigns(:user)).to be_persisted
    end
  end
end

【讨论】:

  • 阅读描述中最后一个粗体字
  • user_params 应该不同,必须验证用户密码和密码确认以及用户名的唯一性
  • 是的,这行得通。谢谢你。我仍然不知道为什么我的方法不起作用。我的规范中的 user_params 具有相同的属性。它只是不想通过。我会折射你所做的。但现在很好解决。非常感谢!!!
猜你喜欢
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多