2010-04-20 5 views
17

Rspec을 사용하여 테스트 사례를 작성하는 방법을 배우고 있습니다. 나는 포스트가 많은 코멘트를 가질 수있는 간단한 포스트 비계를 가지고있다. Rspec을 사용하여 테스트하고 있습니다. Post :has_many :comments을 확인하려면 어떻게해야합니까? 내가 Post.comments 메서드를 스터핑하고 코멘트 개체 배열의 mock 개체를 반환하여 이것을 확인해야합니까? AR 협회 테스트가 실제로 필요합니까?RSpec의 ActiveRecord 연결 확인

답변

28

ActiveRecord 연관은 Rails 테스트 스위트에서 잘 테스트되어야하며 대부분의 사람들은 작동 여부를 확인하지 않아도됩니다.

모델이 인 것을 확인하려는 경우 이러한 연관성을 사용하면 그 차이가 나올 수 있습니다. 테스트하고 싶지 않을 수도 있습니다. 나는 shoulda 보석을 사용하여 이것을하고 싶다. 그것은 당신이 다음과 같이 깔끔한 일을 수행 할 수 있습니다

describe Post do 
    it { should have_many(:comments).dependent(:destroy) } 
end 
+0

감사! 지금 아주 명확한 전망을 얻었다. –

+0

Woops, 다시 확인하십시오. 나는 Shoulda 보석이 아니라 factory_girl을 의미했습니다. –

0

대부분의 사람들은 연관을 테스트하지 않습니다. 레일스는 이미 해당 메소드가 올바르게 작동하는지 확인하기위한 단위 테스트를 이미 가지고 있기 때문입니다. proc 또는 무언가와 같이 복잡한 작업을 수행하는 경우 명시 적으로 테스트하고 싶을 수 있습니다. 대개 그냥 수행하면됩니다.

a = Post.new 
a.comments << Comment.new 
assert a.save 
assert a.comments.size == 1 

또는 이와 유사한 것입니다.

+0

부분적으로 당신을 잡았습니다. 나는 새로운 테스트입니다.관련 게시물이 삭제 될 때 모든 주석이 삭제되는지 확인하기 위해 단위 테스트를 작성한다고 가정 해보십시오. 그럼 충분하니? 또한 나는 스 캐 폴딩으로 생성 된 파괴 방법을 검증하기 위해 단위 테스트를 작성해야합니다. –

12

시험 협회는 특히 TDD 매우 regarded- 다른 개발자들은 해당 코드를보고하기 전에 사양을 보일 것입니다 환경에서 일반적으로 좋습니다. 테스트 연관은 spec 파일이 코드를 가장 정확하게 반영하는지 확인합니다. 당신이 연결을 테스트 할 수 있습니다

두 가지 방법 : FactoryGirl와

  1. :이 상대적으로 피상적 인 테스트가

    expect { FactoryGirl.create(:post).comments }.to_not raise_error 
    

    입니다 것입니다, 공장 등으로 :

    factory :post do 
        title { "Top 10 Reasons why Antelope are Nosy Creatures" } 
    end 
    

    반환 모델에 has_many 주석이 연결되어 있지 않으면 NoMethodError가 발생합니다.

  2. ActiveRecord #reflect_on_association 메서드를 사용하면 연관성에 대해보다 자세히 살펴볼 수 있습니다. 더 복잡한 관계로, 예를 들어 :

    class Post 
        has_many :comments, through: :user_comments, source: :commentary 
    end 
    

    당신은 당신의 관계를보다 자세히 검토 할 수 있습니다 : 옵션이나 조건과 관련된

    reflection = Post.reflect_on_association(:comment) 
    reflection.macro.should eq :has_many 
    reflection.options[:through].should eq :user_comments 
    reflection.options[:source].should eq :commentary 
    

    및 테스트 무엇 이건.

1

당신이 아니라 당신의 연결을 테스트 할 shoulda 같은 외부 보석을 사용하지 않는 게 좋을 경우 (참조 Robert SpeicherAnswer 그에 대한 자세한 내용은), 또 다른 옵션은 관련 협회의 AssociationReflection 개체를 가져 reflect_on_association을 사용하는 것입니다 다음 내용을 주장하십시오.

describe Post do 
    it "should destroy its comments when it is destroyed" do 
    association = Post.reflect_on_association(:comments) 

    expect(association).to_not be_nil 
    expect(association.options[:dependent]).to eq :destroy 
    end 
end