2011-09-03 5 views
1

예 : store#process_order과 같이 테스트해야하는 여러 가지 작업을 수행하는 인스턴스 메소드가 있습니다. 고객에게 전자 메일을 보내고 orders 테이블에 항목을 추가하고 신용 카드를 청구하는지 테스트하고 싶습니다. rspec에서 이것을 설정하는 가장 좋은 방법은 무엇입니까? 현재, 저는 rspec과 factory girl을 사용하고 있습니다. 다음과 같이합니다 :여러 "it"블록을 사용하여 rspec에서 테스트 설정

describe Store do 
    describe "#process_order" do 
    before do 
     @store = Factory(:store) 
     @order = Factory(:order) 
     # call the process method 
     @store.process_order(@order) 
    end 

    it 'sends customer an email' do 
     ... 
    end 
    it 'inserts order to db' do 
     ... 
    end 
    it 'charges credit card' do 
     ... 
    end 
    end 
end 

하지만 정말 지루합니다. 이 방법이 실제로 여러 가지 작업을 수행하는 데 필요한 메서드에 대한 스펙을 작성하는 올바른 방법일까요?

참고 : 좋은 디자인인지 여부에 대한 답변에 관심이 없습니다. 그것은 내가/내 질문 - 이런 종류의 사양을 작성하는 방법을 도왔습니다.

+0

여러 가지 일을하는 경우 몇 가지 다른 테스트가 있어야합니다. 드라이는 규칙이 아닙니다! – Eric

답변

1

저는 여러분이하고있는 것이 괜찮다고 생각합니다. 그리고 rspec을 사용하는 방법이라고 생각합니다. 앱에 대한 모든 진술 (사양)은 자체 블록을 갖습니다.

before (:all) do을 사용하면 주문을 한 번만 처리해야하지만 사양이 실행되는 순서에 따라 달라질 수 있습니다.

describe "#process_order" 안에있는 모든 코드를 하나의 큰 it 블록으로 결합 할 수는 있지만 원할 경우 읽기 쉽지 않을 수 있으며 rspec은 스펙이 실패 할 때 덜 유용한 오류 메시지를 줄 것입니다. 머리로 가서 raise을 테스트 중 하나에 추가하고 현재 수행중인 것처럼 rspec에서 얻을 수있는 좋은 오류 메시지를 확인하십시오.

2

미래에 문제가 발생할 경우 어떤 요소가 고장 났는지 식별 할 수 있기 때문에 좋은 방법입니다. 나는 모든 것을 개별적으로 테스트하기위한 것이다. 나는 레일스 기능처럼 데이터베이스에 삽입되는 것을 체크하지 않는 경향이있다. 대신 단순히 객체의 유효성을 검사합니다.

이것은 RSpec 책에서도 사용되는 방법입니다. RSpec과 관련된 것에 대해 확신이 서지 않는다면 확실히 읽는 것이 좋습니다.

1

전체 프로세스를 테스트하려는 경우 단위 테스트가 아닌 통합 테스트를 말합니다. #process_order 몇 가지 작업을 테스트하려면 다른 방법을 호출하는 것이 좋습니다. 그래서 #should_receive expectations를 추가하고 모든 경로가 포함되도록합니다. 그런 다음 모든 메소드를 별도로 지정하여 모든 것을위한 훌륭한 유닛 스펙 세트를 갖게됩니다. 결국 모든 조각이 함께 작동하는지 확인하는 통합/수용 사양을 작성하게 될 것입니다.

또한 #let을 사용하여 사양 예제 (블록) 간의 종속성을 제거하는 테스트 개체를 설정합니다. 그렇지 않으면 예제 중 하나의 실패로 인해 잘못된 피드백을주는 다른 예에서 오류가 발생할 수 있습니다.

관련 문제