2010-12-02 3 views
0

레일 스 스 캐 폴딩으로 생성 된 기본 사양을 확장하려고 시도하면서 RSpec의 믿을 수 없을만큼 혼란스러운 구문을 처음으로 잡으려고합니다.관련된 (belongs_to) 관계에 대한 RSpec 스텁 및 모의도

아주 간단하게

I 연결 한 모델 ... :

#clown.rb 
class Clown < ActiveRecord::Base 
    has_many :rabbits 
end 

#rabbit.rb 
class Rabbit < ActiveRecord::Base 
    belongs_to :clown 
end 

하지만 rabbits_controller.spec.rb에 문제가 있어요. 그 점에서, 제가 광대를 언급 할 때 스펙이 ​​실패합니다. 이름은입니다. 어리석은 단순한 응용 프로그램이 예상대로 작동하지만 토끼가 올바르게 반응하도록 광대를 조롱하지 않았기 때문에 사양이 실패합니다 (적어도 내가 생각한 것). 어떻게 스텁을 추가해야합니까? (또는 토끼가 연관되어있는 광대를 비웃는 것).

#rabbits.controller.spec.rb 
    require 'spec_helper' 

    describe RabbitsController do 

     def mock_rabbit(stubs={}) 
     (@mock_rabbit ||= mock_model(Rabbit).as_null_object).tap do |rabbit| 
      rabbit.stub(stubs) unless stubs.empty? 
     end 
     end 

     describe "GET index" do 
     it "assigns all rabbits as @rabbits" do 
      Rabbit.stub(:all) { [mock_rabbit] } 
      get :index 
      assigns(:rabbits).should eq([mock_rabbit]) 
     end 
     end 

    ... 

답변

1

이럴을 (그리고 다른 관점이있다)이 조롱하지 않거나 상황을 스텁 :

기존. 가짜 및 스텁은 외부 종속성에 유용합니다 (웹 서비스를 생각해보십시오). 그러나 이것은 애플리케이션 내부에 있습니다. 원하는 것은 factory_girl과 같은 것으로, 비품과 같은 두통없이 테스트 데이터를 만들거나 모든 의존 관계를 조롱하려고 할 때 신속하게 단조롭게됩니다. factory_girl 큰 문서를 가지고 있지만 간략히처럼 공장 보일 수 있습니다 무엇 : 당신은 다음과 같이 테스트에서 사용할 것

Factory.define(:clown) do |f| 
    f.rabbits{|c| [c.assocation(:rabbit)]} 
    f.name "Pierrot" 
end 

Factory.define(:rabbit) do |f| 
    f.association :clown 
end 

: 잘

describe RabbitsController do 
    describe "GET index" do 
    it "assigns rabbits" do 
     @rabbit = Factory(:rabbit) 
     get :index 
     assigns[:rabbits].should == [@rabbit]  
    end 
    end 
end 
+0

를, 다음이 배우는 사람에게 더 많은 혼란을 가져 왜 Rails3/RSpec 템플릿은'mock_rabbit' 블록을 디폴트로 포함할까요? 나 같은 사람들을 혼란에 빠뜨리는거야? 나는 내가 실제로 알지 못하는 것보다 레일스에 대해 더 많이 배울수록 ... – Meltemi

+0

어쩌면 그들은 모를 트릭을 가지고 있을지도 모른다. 그러나 종교적으로 테스트하는 누군가로서 나는 훨씬 쉽게 삶을 발견했다. 내 내부 의존성에 대한 공장들. 잠시 동안 당신의 테스트를 데이터베이스 연결과 독립적으로 유지하는 것에 대해 많은 사람들이 외쳤지 만, 시간이 지남에 따라 PITA와 같은 종류의 테스트가 진행되고 애플리케이션 테스트에 초점을 맞추기보다는 테스트가 농구를 뛰어 넘는 것으로 끝나게 될 것이라고 생각합니다. – karmajunkie

관련 문제