2014-03-13 2 views
0

저는 Rspec과 Capybara를 처음 사용합니다. 방문 root_pathrspec : 정의되지 않은 메서드 'testimonials'for nil : NilClass

NoMethodError : 정의되지 않은 메서드`평가 '전무을 위해 : NilClass 내가 노력

하기 위해 두 가지 방법을 보자 내가지고있어 오류가 방문 갤러리

장애/오류 홈페이지에서 탐색하다 스펙에 변수를 정의하십시오. 나는 내가 잘못하고있는 것에 대한 피드백을 얻을 수 있도록 두 가지를 모두 추가했다.

class WelcomeController < ApplicationController 
    def index 
     @event = Event.last 
     @event.testimonials.first ? @latest_testimonial = @event.testimonials.first.id : @latest_testimonial = nil 
    end 
end  

feature 'Navigation from homepage' do 

    before :each do 
     visit root_path 
     find('#nav-menu').find('h1').click #opens up navigation bar 
    end 

    scenario 'Visit Gallery' do 
     find('#nav-gallery').find('.no_bar').click 
     let(:event) {Event.last} #1st attempt at solving Rspec error. 
     let(:event) {mock_model(Event, id: 3, name: "Jack & Jill", date: "2004-06-10", created_at: "2014-03-10 02:57:45", updated_at: "2014-03-10 02:57:45")} #2nd attempt at solving Rspec error. 
     controller.stub(:event) 

     expect(page).to have_css 'img.photos' 
    end 
end 

답변

2

다른 답변은 정확합니다 - 본질적으로 더 단순한 (또는 이미 알고있는 것을 설명함으로써 더 자세히 설명하는) 동일한 내용입니다. 테스트가 수행

첫 번째 것은 아마도 WelcomeControllerindex 조치를 호출 root_path을 방문 할 before 블록을 실행합니다. 메서드가 수행하는 첫 번째 작업은 Event.last이며 nil을 반환합니다. 테스트 데이터베이스가 비어있어 반환 할 마지막 레코드가 없기 때문입니다. 그런 다음 testimonials@event에 전화하면 @eventnil이므로 오류가 표시됩니다.

이 문제를 해결하려면 데이터베이스에 Event 레코드를 만들어 root_path으로 이동하고 index 작업을 호출해야합니다. 그렇게하는 한 가지 방법은 visit root_path 전에이 줄을 추가하는 것입니다 :

Event.create(name: "Jack & Jill" [...]) 
데이터베이스에 레코드를 생성합니다

, 그래서 Event.last 뭔가를 반환합니다.

또한 let 문과 controller.stub 문을 모두 없앨 수 있습니다. 그것들은 이제 불필요합니다 (그리고 어쨌든 다른 문제들도있었습니다). 코드를 실행하려면 충분해야합니다.

연습에서는 여기에 표시된 것처럼 공장에서 (FactoryGirl과 같은 도구를 사용하여) 또는 mocks/스텁이 들어있는 레코드를 만들지 않습니다. 그러면 let을 사용하여 해당 항목을 before 블록에 한 번만 넣고 실제 사용되는 후속 테스트에 생성 한 오버 헤드를 제한합니다.

주된 요점은 개체가 존재한다고 가정하는 컨트롤러 작업을 시작하기 전에 개체 설정 (및 필요한 경우 레코드)을 수행해야한다는 것입니다.

+0

기능 테스트에서 모의 ​​/ 스텁을 사용하는 것이 좋지 않습니까? 필자는 제안대로 Factory Girl을 구현했습니다. – ltrainpr

+0

내 자신의 환경 설정은 통합 테스트에서 지속 된 객체를 사용하는 것이지만 제 생각에는 많은 것을 저장하지 않습니다.FactoryGirl을 사용하면 stubbed 버전의 객체를 빌드하여 DB를 사용하지 않으려 고하는 위치에 피할 수 있습니다. –

1

Event.last은 무응답입니다.

일반적인 (가장 쉬운) 방법은 사이트를 방문하기 전에 테스트에 이벤트를 작성한 다음 컨트롤러에서 사용하는 것입니다. 기능 사양에는 실제로 조롱과 스터 빙의 최소량이 포함되어야합니다. 시스템과 상호 작용하는 실제 사용자를 나타냅니다.

귀하의 스텁은 사용되지 않습니다 (실제로는 자체 오류입니다). 이것은 설정되기 전에 오류가 발생한다는 사실을 통해 확인됩니다.

관련 문제