2012-05-07 2 views
4

필자는 스펙에서 몇 가지 예에 대해서만 필요한 비싼 테스트 설정을 가지고 있으며, 필요한 경우 한 번만 실행하면됩니다. 느리기 때문에 이전 (: 각) 블록에 넣지 않으려 고하지만 이전 (: all)이 내 필요에 맞지 않는 것 같습니다. 난 비싼 부분은 다른 일반적인 설치 후 실행해야한다는 복잡한 요소가 있다고 생각합니다. (이것은 검색 엔진 응용 프로그램에 대한 카피 바라 테스트입니다 일부 레코드를 생성 한 후, 나는 검색 결과를 얻기 위해 인덱스에 테스트 데이터베이스가 필요합니다..) 내 설정은 다음과 같이이다 : 문제는rspec의 특정 컨텍스트에 대한 일회성 구성은 무엇입니까?

feature 'some particular feature' do 
    before(:each) do 
    # a bunch of common test setup (creating records that this test will use) 
    end 

    describe 'simple example #1' do 
    # a simple example that doesn't need the expensive setup 
    end 
    . 
    . 
    . 
    describe 'simple example #N' do 
    # a simple example that doesn't need the expensive setup 
    end 

    describe 'a more complicated example' do 
    before(:all) do 
     # expensive_setup that depends on the records created above 
    end 

    it 'does something' do ... end 
    it 'does something else' do ... end 
    . 
    . 
    . 
    it 'even does this' do ... end 
    end  
end 

rspec이 more complicated example 컨텍스트에서 예제를 실행 중일 때 before(:all) 블록은 보다 먼저 실행되고before(:each) 블록을 사용합니다. 지금까지 before(:all) 블록 대신 비싼 설정을 before(:each) 블록에 넣어야했습니다. 즉, 값 비싼 설정은 해당 예제의 각 it 블록에 대해 실행되어야합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

업데이트 : 비싼 작업의 결과가 데이터베이스에 을 따라 언급하는 데 실패 . 따라서 각 예제는 동일한 데이터베이스 설정을 사용하기 때문에 각 예제에 대해 값 비싼 작업 결과를 다시 사용하는 것이 안전합니다. 또한, 결과는 파일 시스템에 있으므로, 예제들 사이에 결과는 지워지지 않을 것입니다.

나는가는 길은 결과가 좋고 다시 계산할 필요가 없다는 것을 나타내는 일종의 마커를 파일 시스템에 넣는 것이라고 생각합니다.


+1

문제는 (대부분의 설정에서) 데이터베이스 레코드가 테스트 사이에 제거된다는 것입니다. 따라서 값 비싼 작업이 db 레코드에 종속되거나 생성되면 db 레코드가 파괴됩니다. –

+0

예. 이 경우 비싼 작업의 결과는 파일 시스템의 디렉토리에 있습니다. 또한 비싼 작업의 결과가 데이터베이스의 레코드에만 의존한다는 것을 분명히 밝힐 필요가 있습니다. 따라서 검색을 위해 데이터베이스를 인덱싱합니다. 따라서 각 예제에서 데이터베이스 설정이 동일하므로 이전 예제의 결과를 다시 사용하는 것이 안전합니다. – speedarius

답변

0

일반적인 설정의 요약을 계산하고 값 비싼 작업 결과를 저장하여 문제를 해결했습니다. 값 비싼 작업을 수행하기 전에 현재 다이제스트가 디스크의 것과 일치하는지 확인하십시오. 그렇다면 그렇게 할 필요가 없습니다. 모든 예제가 공통 설정을 공유하기 때문에 값 비싼 작업은 최대 한 번만 실행됩니다.

0

관심있는 부분을 변수에 저장하면 어설 션을 할 수 있습니다. 다음은 해킹입니다.

feature 'Aides page' do 

    context 'No active user' do 
    that = nil 
    before do 
     if !that 
     create_2_different_aids 
     disable_http_service 
     visit aides_path 
     that = Nokogiri::HTML(page.html) 
     end 
    end 
    after do 
     enable_http_service 
    end 
    scenario 'Should display 2 aids NOT related to any eligibility' do 
     display_2_aids_unrelated_to_eligibility(that) 
    end 
    scenario 'Should not display breadcrumb' do 
     expect(that.css('.c-breadcrumb').size).to eq(0) 
    end 
    end 

end