2016-11-20 3 views
0

Я хотел добавить некоторые пользовательские поля в регистрацию пользователя, поэтому я перепробовал контроллер регистрации разработки. Теперь я пытаюсь написать тест, который должен (я думаю) создать нового незарегистрированного пользователя. Тест не работает, и я не уверен, что искать здесь.Как проверить регистрацию при переопределении контроллера разработки?

# note: this is a dump of `:valid_attributes` by my test 
{"id"=>nil, "name"=>"Hans Swift", "email"=>"[email protected]", "encrypted_password"=>"$2a$04$T6mRo3Dzcv6iV7Kdh52E6OA0tAX7nE4y3skV2jzkD9CLr5v8Dri1K", "reset_password_token"=>nil, "reset_password_sent_at"=>nil, "remember_created_at"=>nil, "sign_in_count"=>0, "current_sign_in_at"=>nil, "last_sign_in_at"=>nil, "current_sign_in_ip"=>nil, "last_sign_in_ip"=>nil, "confirmation_token"=>nil, "confirmed_at"=>nil, "confirmation_sent_at"=>nil, "unconfirmed_email"=>nil, "failed_attempts"=>0, "unlock_token"=>nil, "locked_at"=>nil, "created_at"=>nil, "updated_at"=>nil} 
F 
Failures: 

    1) Users::RegistrationsController POST #create with valid params creates a new User 
    Failure/Error: 
     expect { 
     puts valid_attributes 
     post :create, {:user => valid_attributes}, valid_session 
     }.to change(User, :count).by(1) 

     expected #count to have changed by 1, but was changed by 0 
    # ./spec/controllers/users/registrations_controller_spec.rb:19:in `block (4 levels) in <top (required)>' 

Может кто-нибудь предложить причину, по которой этот тест не создает пользователя? Приложение работает правильно, и я получаю сообщение электронной почты, когда я использую форму users/sign_up.

./spec/controllers/users/registrations_controller_spec.rb

require 'rails_helper' 
require 'factory_girl_rails' 

RSpec.describe Users::RegistrationsController, type: :controller do 

    describe "POST #create" do 
    let(:valid_attributes) { FactoryGirl.build(:user_for_registration).attributes } 
    let(:invalid_attributes) { User.get_invalid_user.attributes } 
    let(:valid_session) { {} } 

    # Help Devise map routes from the test back to the original controller. 
    # See http://stackoverflow.com/questions/6659555/how-to-write-controller-tests-when-you-override-devise-registration-controller 
    before :each do 
     request.env['devise.mapping'] = Devise.mappings[:user] 
    end 

    context "with valid params" do 
     it "creates a new User" do 
     expect { 
      puts valid_attributes 
      post :create, {:user => valid_attributes}, valid_session 
     }.to change(User, :count).by(1) 
     end  
    end 

    end 

end 

./app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController 
    before_filter :configure_permitted_parameters, if: :devise_controller? 

    protected 

    # we have to explicitly permit params in overridden controllers like this 
    # see https://github.com/plataformatec/devise#strong-parameters 
    def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up) do |u| 
     u.permit(:name, :email, :password, :password_confirmation) 
    end 
    devise_parameter_sanitizer.permit(:account_update) do |u| 
     u.permit(:name, :email, :password, :password_confirmation, :current_password) 
    end 
    end 
end 

./spec/factories/users.rb

require 'ffaker' 

FactoryGirl.define do 
    factory :user do |u| 
    @pass = "password" 

    name FFaker::Name.name 
    email { |me| "#{name.to_s.gsub(/\s/,'.')}_#{rand(1000).to_s}@testing.com" } 
    password @pass 

    factory :user_for_registration do 
     password_confirmation @pass 
    end 

    factory :user_for_account_update do 
     password_confirmation @pass 
     current_password @pass 
    end 
    end 
end 
+1

Я думаю, что вы передаете неправильные параметры по запросу. Похоже, вы должны передавать ': name,: email,: password,: password_confirmation', а не' encrypted_password' и т. Д. Я не отправил его в качестве ответа, поскольку я не 100%. Проверьте журналы и посмотрите, какие параметры отправляются. – DickieBoy

+0

Да, это выглядит правильно. Кажется, я должен использовать 'FactoryGirl :: attributes_for (: user)' вместо 'FactoryGirl :: build (: user) .attributes'. Когда я меняю это, тест проходит. Не уверен, когда я начал использовать FactoryGirl :: build() .. Хорошо, хорошо знать, спасибо! – doub1ejack

+0

Судя по этому, 'attributes_for' выглядит так, что он даст вам атрибуты после того, как запущена цепочка фильтров. Вероятно, вам стоит немного заглянуть в него и опубликовать его как ответ. – DickieBoy

ответ

1

Вы говорите, что ваши испытания постам эти атрибуты:

{ 
    "id"=>nil, 
    "name"=>"Hans Swift", 
    "email"=>"[email protected]", 
    "encrypted_password"=>"$2a$04$T6mRo3Dzcv6iV7Kdh52E6OA0tAX7nE4y3skV2jzkD9CLr5v8Dri1K", 
    "reset_password_token"=>nil, 
    "reset_password_sent_at"=>nil, 
    "remember_created_at"=>nil, 
    "sign_in_count"=>0, "current_sign_in_at"=>nil, 
    "last_sign_in_at"=>nil, 
    "current_sign_in_ip"=>nil, 
    "last_sign_in_ip"=>nil, 
    "confirmation_token"=>nil, 
    "confirmed_at"=>nil, 
    "confirmation_sent_at"=>nil, 
    "unconfirmed_email"=>nil, 
    "failed_attempts"=>0, 
    "unlock_token"=>nil, 
    "locked_at"=>nil, 
    "created_at"=>nil, 
    "updated_at"=>nil 
} 

Во-первых, это на самом деле POSTING все те под user ключ, так PARAMS контроллера, на самом деле являются user[id], user[name] и т.д. . Devise нуждается в том, чтобы его параметры были на верхнем уровне, например:

post :create, valid_attributes, valid_session 

Во-вторых, этот большой список атрибуты, безусловно, не то, что ваши POST-сообщения, и ваш контроллер разрешает только name, email, password и password_confirmation. Поэтому я думаю, что после устранения первой проблемы запрос на ваш тест все равно будет отклонен. Чтобы исправить ситуацию, убедитесь, что ваш тест содержит только те четыре атрибута.

В следующий раз вокруг, вы можете получить хорошие советы о неудачах тестов, запустив только одного теста (rspec spec/controllers/users/registrations_controller_spec:123 где 123 это номер строки Теста в), и просмотр log/test.log.

Как только вы получите это сообщение, я также напишу несколько тестов, подтверждающих, что эти параметры требуются.

Также я вижу, что вы проходите valid_session, и я тоже удалю это. Devise не позволит вам зарегистрироваться, если вы уже вошли в систему. Несмотря на то, что он пуст, по-прежнему кажется путаным его включать.

+0

Удивительно, я не знал о 'log/test.log' - это огромная помощь. – doub1ejack

+0

Кроме того, к вашему второму пункту была проблема: я передавал «FactoryGirl :: build (: user) .attributes' вместо' FactoryGirl :: attributes_for (: user) ', и именно поэтому у меня этот длинный список (база данных поля, на самом деле) вместо 4 полей, которые мне нужны. – doub1ejack

Смежные вопросы