2017-12-18 4 views
0

레일 4.1에 RSPEC 및 Capybara로 테스트를 수행하는 애플리케이션이 있습니다. 데이터가있는 테스트 데이터베이스가 있습니다. 나는 테스트를 수행하는 데 사용하고, 나는 bd에 저장된 일부 데이터를 생성하는 테스트를 실행하고 있거나 필요한 것은 테스트를 실행 한 후 이들 데이터가 저장되어 있지 않다는 것이다.RSPEC 및 Capybara를 사용하여 테스트를 실행하여 생성 된 데이터의 깨끗한 테스트 데이터베이스

필자는 보석 DB_cleaner (RSPEC 및 Capybara를 사용하여 생성 된 데이터 만 테스트 한 깨끗한 테스트 데이터베이스)를 사용했지만 테스트 bd의 모든 데이터가 지워지고 필자가 생성 한 데이터 만 지우고 싶습니다. 테스트.

나는이 구성을 가지고 있고, 시험은 javascrpit 테스트입니다 :

config.use_transactional_fixtures = false 
    config.before(:suite) do 
     if config.use_transactional_fixtures? 
      raise(<<-MSG) 
      Delete line `config.use_transactional_fixtures = true` from rails_helper.rb 
      (or set it to false) to prevent uncommitted transactions being used in 
      JavaScript-dependent specs. 

      During testing, the app-under-test that the browser driver connects to 
     uses a different database connection to the database connection used by 
      the spec. The app's database connection would not be able to access 
      uncommitted transaction data setup over the spec's database connection. 
      MSG 
     end 
    DatabaseCleaner.clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
end 

    config.before(:each, type: :feature) do 
     driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test 

     if !driver_shares_db_connection_with_specs 
      DatabaseCleaner.strategy = :truncation 
    end 
end 
+1

실행하는 각 테스트에 대해 데이터베이스를 깨끗한 상태로 유지하지 못하게하는 이유를 파악하기가 어렵습니다. 테스트 데이터베이스에 데이터를 가지고있는 목적은 무엇입니까? - 유스 케이스를 명확히 할 수 있습니까? – David

답변

0

당신이 사용할 수있는이

rake db:reset RAILS_ENV=test 
+0

이것은 테스트 bd를 재설정합니다. bd에 데이터가 저장되지 않아 다른 테스트 케이스가 영향을받지 않습니다. ,하지만 같은 실행에서 – Andres23Ramirez

+0

[database_cleaner] (https://github.com/Dat)를 사용해 볼 수 있습니다. abaseCleaner/database_cleaner) –

+0

그리고 [: truncation] (https://github.com/DatabaseCleaner/database_cleaner#what-strategy-is-fastest) 옵션을 사용하십시오. –

1

원하는 데이터를 포함하는 테이블의 레코드를 만드는 경우 테스트에 저장되면 테스트를 시작할 때 기존 데이터를 유지 관리하는 쉬운 방법은 없습니다 (database_cleaner의 간단한 구성 변경 등). 이는 레일스 4.1에서 Capybara 및 JS 테스트와 호환되지 않는 database_cleaner의 트랜잭션 모드이기 때문입니다 (Rails 5.1 트랜잭션 모드는 호환 가능하며 대부분의 구성에서 database_cleaner는 더 이상 필요하지 않습니다)

테스트에서 저장하고자하는 테이블의 레코드를 생성/삭제/업데이트하면 database_cleaner에게 그 테이블을 건너 뛰도록 지시 할 수 있습니다.

원하는 것을하기가 쉽지 않으므로 자신이 왜 다른 사람이 가장하지 않는지 정확히 묻는 것이 좋을 것입니다.

아직 수행하려는 작업을 계속 수행하려는 경우 (그리고 새 행을 추가하기 만하면) 테스트에서 기존 데이터를 수정하지 않는 경우 이전에 작성한 후크를 만들어야합니다. 각 테이블에 최대 ID를 저장 한 다음 ID가 큰 레코드를 제거하고 데이터베이스 cleaner를 사용하지 않는 후크

+0

답장을 보내 주셔서 감사합니다. 매우 도움이됩니다. 내가 원하는 것을 수행하는 것이 올바른 방법이 아니라고 말하면, 올바른 방법은 무엇인지 말해 줄 수 있습니까? – Andres23Ramirez

+0

@ Andres23Ramirez 일반적으로 기능 테스트는 테스트 시작시 특정 테스트에 필요한 레코드 만 설정하여 수행됩니다. 그렇게하면 각 테스트가 다른 테스트와 완전히 분리됩니다. 테스트를하기 전에 모든 테스트를 수행하기 전에 테스트 DB를 미리 채울 이유가 무엇인지에 대한 자세한 정보 나 예제가 없어도 그 이유는 분명히 있습니다. –

관련 문제