2015-10-07 2 views
0

У меня есть простой контроллер Rspec test. Я тестирую действие контроллера пользователя.Rspec: Failure/Error: ожидать (назначает (: пользователь)). Be_persisted

Но я получаю эту ошибку

$ 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: "[email protected]", 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: "[email protected]", 
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"=>"[email protected]", 
"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 здесь в тесте, то посмотрите на них в создании действия. Они такие же. Просто некоторые атрибуты, такие как пароль и подтверждение пароля, не передаются.

+0

Вы проверили, если пользователь, где вы получите user_params от был сохранялось? У вас есть параметры белого списка в вашем контроллере? Вы не являетесь белым листингом только по электронной почте, имени пользователя, описанию и паролю? – pedros

+0

В вашей модели или вашей БД вы проверяете наличие пароля? Если так, то это произойдет без него – pedros

ответ

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 
+0

Спасибо, но это точно такая же ошибка. – joeyk16

+0

Прочтите последний жирный текст в описании – joeyk16

+0

'user_params' должен быть другим, для подтверждения имени пользователя и подтверждения пароля и уникальности для имени пользователя –