2013-08-14 3 views
2

RSpec에서 사용하는 멋진 기술은 Shoulda와 Shoulda-context를 사용하는 프로젝트에서도 사용하고 싶습니다. 그러나 그것이 가능한지 나는 모른다. 이것을 할 수있는 방법이 있습니까?RSpec의`let`과 같은 설정 값을 shoulda 문맥에서 오버라이드하는 법?

내가 원하는 것 : 중첩 된 컨텍스트에서 let 절을 참조하는 외부 컨텍스트에서 setup (before) 블록을 정의하십시오. 이렇게하면 내부 컨텍스트가 외부에서 참조되는 값을 구성 할 수 있습니다. setupsetup은 여전히 ​​내부 컨텍스트에서 DRY가 될 수 있습니다.

describe Thing do 
    before do 
    # Notice that `user` isn't defined here--it's defined in `let` blocks 
    # in nested contexts below. 
    login_as user 

    # Assume there's lots more code here that I would like to keep 
    # DRY across contexts. 
    end 

    context "when logged in as an admin" do 
    # THIS IS THE MAGIC RIGHT HERE: 
    let(:user) { Factory(:user, role: "admin") } 

    it "should ..." ... 
    end 

    context "when logged in as a normal user" do 
    # THIS IS THE MAGIC RIGHT HERE: 
    let(:user) { Factory(:user) } 

    it "should ..." ... 
    end 
end 

가 요약하면 : : 방법 -

RSpec에 예제 (내 실제 예제 내가 복제하지 않을 before 블록에 더 많은 코드가 있다고 가정 해주십시오 예는 간단하다) shoulda-context와 Test :: Unit으로 이것을 할 수 있습니까?

작동하지 않았다 나는 이미 시도 몇 가지 :

  • def 각 서브 컨텍스트에서 메서드를 재정의 할 수 있습니다.
  • before_should 각 하위 컨텍스트에서.

답변

1

테스트 사이에서 반복되는 코드를 추출하는 데 유용한 테스트 클래스 내에 도우미 메서드가 있음을 발견했습니다. 좋아요 :

class MyTest < TestCase 
    context "when logged in as an admin" do 
    setup do 
     do_login Factory(:user, role: "admin") 
    end 

    should "..." do 
     [email protected] 
    end 
    end 

    context "when logged in as an admin" do 
    setup do 
     do_login Factory(:user) 
    end 

    should "..." do 
     [email protected] 
    end 
    end 

    def do_login(user) 
    login_as user 
    @user = user 

    # lots more setup code here... 
    end 
end 
+0

잘 작동합니다. 감사! –