2012-07-09 2 views
1

을 실패, 나는 알아낼 수없는 이유 :RSpec에 시험이 다음 컨트롤러 검사가 실패

RSpec에가 (오히려 도움이되지 않는) 오류까지 제공

describe "GET 'index'" do 

    before(:each) do 
     @outings = FactoryGirl.create_list(:outing, 30) 
     @user = FactoryGirl.create(:user) 
    end 

    it "should be successful" do 
     get :index 
     response.should be_success 
    end 

end 
: 여기

Failure/Error: response.should be_success 
    expected success? to return true, got false 

코드가 있어요 실제 컨트롤러도 마찬가지입니다.

def index 
    if @user 
     @outings = Outing.where(:user_id => @user.id) 
     @outing_invites = OutingGuest.where(:user_id => @user.id) 
    else 
     flash[:warning] = "You must log in to view your Outings!" 
     redirect_to root_path 
    end 
end 

누구든지 내 테스트가 실패하는 원인을 알 수 있습니까? 나는 그것이 Outing Controller의 조건부와 관련이 있다고 생각하지만, 통과 테스트가 어떻게 될지 전혀 모르겠다. ...

+0

컨트롤러의 인스턴스 변수를 사양과 혼동스럽게 생각한다고 생각합니다. 귀하의 컨트롤러에서 @user와 값을 연결하는 코드는 어디에 있습니까? – cfeduke

답변

1

두 개의 서로 다른 클래스 사이에 인스턴스 변수가 혼란 스럽다. 자체 클래스이고 스펙은 자체 클래스입니다. 그들은 국가를 공유하지 않습니다. 당신은

def index 
    // obvious bad code, but used to prove a point 
    @user = User.first 
    if @user 
     @outings = Outing.where(:user_id => @user.id) 
     @outing_invites = OutingGuest.where(:user_id => @user.id) 
    else 
     flash[:warning] = "You must log in to view your Outings!" 
     redirect_to root_path 
    end 
end 

내가 FactoryGirl.create_list(:outing, 30)가 만든 후에는 사용자를 만드는부터 나들이에 첫 번째 사용자를 연결 나들이를 만들지 않습니다 추측거야 ... 더 나은 이해를 얻기 위해이 간단한 예제를 시도 할 수 소풍 때문에 Outing.where도 실패합니다.

테스트 스택에 데이터베이스를 포함시킬 때 데이터베이스는 테스트가 예상하는 방식으로 데이터를 포함해야한다는 것을 이해하는 것이 중요합니다. 따라서 컨트롤러가 특정 사용자의 외출을 쿼리하는 경우 컨트롤러에서 검색 할 사용자 (예 : 내 사례에서 User.first의 끔찍한 행)를 검색 할 수 있도록 환경을 설정해야합니다. 명세가 기대하고있다.

+0

단단한 설명! 당신의 도움을 주셔서 감사합니다. –

+0

나는 FactoryGirl이 마법의 유니콘이 아닌 데이터베이스와 실제로 상호 작용한다는 점을 덧붙여 야합니다. 그리고 처음 사용하기 시작할 때 저를 잠시 쉬었습니다. 만약 당신이 그냥 모든 (pryrepl.org /) pry 당신의 머리카락을 찢어에서 계속 지켜 줄 것을 권 해드립니다. ('binding.pry'는 디버깅 중단 점과 같습니다!) – cfeduke

관련 문제