2016-02-14 43 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场在我的用户模型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