2011-03-13 5 views
2

레일을 배우기 위해 수행 한 간단한 레일 앱용으로 작성한 2 가지 간단한 RSpec 테스트가 있습니다. 원래 Link 클래스의 모의 설정을했지만 동일한 문제가 발생했습니다.RSpec 컨트롤러 테스트가 실패합니다 - 모의 데이터를로드하는 방법?

이 내 테스트 코드입니다 :

require 'spec_helper' 

describe LinksController do 
    render_views 
    before(:each) do 
    link = Link.new 
    link.stub!(:title).and_return("Reddit") 
    link.stub!(:url).and_return("http://www.reddit.com") 
    link.stub!(:created_at).and_return(Time.now) 
    link.stub!(:updated_at).and_return(Time.now) 
    link.stub!(:user_id).and_return("1") 
    link.stub!(:id).and_return("1") 
    link.save 

    user = User.new 
    user.save 
    end 

    it "renders the index view" do 
    get :index 
    response.should render_template('links/index') 
    response.should render_template('shared/_nav') 
    response.should render_template('layouts/application') 
    end 

    it "renders the show view" do 
    get :show, :id => 1 
    response.should render_template('links/show') 
    response.should render_template('shared/_nav') 
    response.should render_template('layouts/application') 
    end 
end 

내가 모두 레일 및 RSpec에 새로운 해요, 확실하지 내가이 작업을 얻기 위해 일을해야하는지. 데이터가 필요할 때 LinksController에서이 show 메소드를 테스트하는 가장 좋은 방법은 무엇입니까? 나는 mock_model도 시도했지만 어쩌면 내가 잘못 사용했다.

당신은 문제가 당신이 모델을 스텁 것을, 그래서이 데이터베이스에 저장되지 않은 것 Github

답변

4

에있는 모든 응용 프로그램 코드를 볼 수 있습니다. 즉, get :show, :id => 1을 호출하면 데이터베이스에 대한 쿼리는 아무 것도 반환하지 않고 테스트가 실패합니다. 스터 빙은 데이터베이스를 사용하지 않고 응답이나 객체를 가짜로 만들려고 할 때 유용하지만 데이터베이스를 사용하는 실제 레일스 코드에 의존하는 경우 데이터베이스에 아무 것도 없기 때문에이 방법을 사용할 수 없습니다. 이 문제를 해결하기 위해 스텁 된 모델을 완전히 삭제하고 실제로 만들 것입니다. 또한 결국 ShamFactory Girl 같은 공장 보석으로 보일 것입니다

require 'spec_helper' 

describe LinksController do 
    render_views 
    before(:each) do 
    user = User.create 

    @link = Link.create :title => "Reddit", 
         :url => "http://www.reddit.com", 
         :user => user 
    end 

    it "renders the index view" do 
    get :index 
    response.should render_template('links/index') 
    response.should render_template('shared/_nav') 
    response.should render_template('layouts/application') 
    end 

    it "renders the show view" do 
    get :show, :id => @link.id 
    response.should render_template('links/show') 
    response.should render_template('shared/_nav') 
    response.should render_template('layouts/application') 
    end 
end 

는 테스트 데이터의 생성을 단순화합니다.

+0

감사합니다. 여전히 내 코드처럼 보이게하는 몇 가지 문제 해결 방법이 있습니다. 색인 및 쇼 페이지 모두에 링크를 제출 한 사용자의 전자 메일 주소 (전체가 아님)를 표시하고 있으며 '전자 메일'에 대해 nil에 대한 메서드 오류가 발생합니다. NilClass는 사용자가 존재하지 않는 것처럼 보입니다. 만들어진. 이 부분을 더 자세히 살펴 보겠지 만 권장 사항이 초기 문제를 해결 한 것으로 보입니다. –

+0

이것은 매우 가능하며 단순히 User.create를 호출하면 유효한 사용자가 생성되지 않기 때문일 수 있습니다. 공장에 대해서는 좋은 점이 있습니다.이 테스트에서는 재사용 할 수있는 유효한 사용자를 만들고 있는지 확인합니다. 유효성 검사를 위해 사용자에게 전자 메일이 필요하면 User.create (: email => '[email protected]')와 같은 작업이 필요할 수 있습니다. –

+0

RSpec은 공장을 지원합니까 아니면 출고시 공장 출신의 소녀를 설치하는 것이 최선입니까? –

관련 문제