2016-02-14 2 views
0

У меня есть собственный валидатор для пароля, который принимает updating_password поле от контроллераТестирование условной проверки с входами контроллера в Rails

attr_accessor :updating_password 

validates :password, presence: true, if: :should_validate_password? 
validates :password, length: { minimum: 6 }, if: :should_validate_password? 

def should_validate_password? 
    updating_password || new_record? 
end 

Я хочу гашу в updating_password поле в моей модели User тесте RSpec, что-то вроде

before(:each) do 
    @user_valid = FactoryGirl.create(:user) 
end 

it "validates for password when updating_password is true" do 
    old_password = @user_valid.password 
    subject { @user_valid } 
    allow(subject).to receive(:updating_password).and_return(true) 
    @user_valid.update(password: "short", password_confirmation: "short") 
    expect(@user_valid.password).to eql(old_password) 
end 

В этом случае пароль не должен обновляться, поскольку он слишком короткий, но тест не работает. Любая помощь будет оценена

ответ

1

Я бы порекомендовал вам не проводить проверку вашей модели. Вместо этого вы можете проверить, что вы пытаетесь сделать так:

# spec/models/user_spec.rb 
describe User do 
    describe 'validations' do 
    context 'while updating password' do 
     let(:user){ FactoryGirl.create(:user, updating_password: true) } 

     it 'requires password to be at least 6 characters long' do 
     expect {user.update!(password: 'short')}.to raise_error(ActiveRecord:RecordInvalid) 
     end 

     it 'requires password to be present' do 
     expect {user.update!(password: nil))}.to raise_error(ActiveRecord:RecordInvalid) 
     end 
    end 
    end 
end