2011-07-05 3 views
2

사용자가 확인 링크를 클릭하면 실제로 확인되었는지 테스트하기 위해 Rails 3 앱에서 Capybara 1.0 테스트를 실행하려고합니다.Rails 3/Capybara가 모델 속성을 저장하지 않습니다.

이제 수동으로 테스트 할 때 실제로 작동합니다. 또한, 당신이 볼 수 있듯이, 이것을 디버깅하는 confirm 메소드에 넣는 puts @ user.confirmed 라인이 있으며, 테스트를 실행할 때 실제로 출력됩니다. 그러나 테스트 자체는 실패합니다.

컨트롤러 메소드를 실행 한 후 내 사용자 모델의 확인 된 속성이 테스트에 의해 기억되지 않는 것처럼 보입니다.

무엇이 누락 되었습니까? 미리 감사드립니다.

테스트 :

it "should allow a user to be confirmed after clicking confirmation link" do 
    fill_in('user_email', :with => '[email protected]') 
    click_button('Submit') 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_false 
    visit confirm_path(@user.confirmation_code) 
    @user.confirmed.should be_true 
end 

컨트롤러 방법 :

def confirm 
    @confirmation_code = params[:confirmation_code] 
    @user = User.find_by_confirmation_code(@confirmation_code) 
    @website = @user.website 
    @user.confirm 
    if @user.referrer_id 
     User.find(@user.referrer_id).increment_signups 
    end 
    flash[:success] = "Thanks for signing up!" 
    flash[:user_show] = @user.id 
      puts @user.confirmed 
    redirect_to "http://" + @website.domain_name 
end 

사용자 모델 방법 :

def confirm 
    self.confirmed = true 
    self.save 
end 

답변

4

당신이 confirm_path를 방문한 후 사용자 개체를 다시로드해야인가요? 시도해보십시오.

it "should allow a user to be confirmed after clicking confirmation link" do 
    fill_in('user_email', :with => '[email protected]') 
    click_button('Submit') 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_false 
    visit confirm_path(@user.confirmation_code) 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_true 
end 

또는 @user.reload을 사용할 수 있습니다.

테스트에서 참조되는 사용자 개체는 응용 프로그램에서 조작되는 개체의 복사본 일 뿐이므로 자동으로 새로 고쳐지지 않습니다. 업데이트 된 값을 얻으려면 데이터베이스에서 다시 가져와야합니다.

+0

예! 이제 테스트가 작동합니다. 신속하고 정확한 답변을 보내 주셔서 감사합니다. – Rebitzele

관련 문제