10

오이를 사용하여 통합 테스트를 작성하고 Database Cleaner을 사용하여 데이터베이스를 깨끗하게 유지합니다. 내 테스트는 자바 스크립트가 필요하지 않기 때문에 모든 것이 완벽하게 작동합니다.카피 바라 웹킷의 데이터베이스 클리너 문제

Capybara webkit을 사용하여이 마지막 테스트를 통과시킬 수는 있지만 데이터베이스가 전혀 정리되지 않습니다.

require 'simplecov' 
SimpleCov.start 'rails' 
require 'cucumber/rails' 

Capybara.default_selector = :css 
Capybara.javascript_driver = :webkit 

begin 
    require 'database_cleaner' 
    require 'database_cleaner/cucumber' 
    DatabaseCleaner[:active_record].strategy = :transaction 
rescue NameError 
    raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it." 
end 


Before do 
    DatabaseCleaner.start 
end 

After do |scenario| 
    DatabaseCleaner.clean 
end 

내가 카피 바라가 사용되지만 작동하지 않았다 드라이버 확인 this 비슷한 시도 :

여기 파일 내 기능/지원/env.rb입니다. 나는 또한 this post의 세 번째 부분에서 언급 한 해킹을 시도했지만 아무 것도 전혀 작동하지 않았다 ...

나는 이걸 어떻게 달성하고 어떤 도움을 주는지 크게 알게 될 것이다.

미리 감사드립니다.

답변

22

빠른 대답 :

는 구성 자바 스크립트 트랜잭션 대신 절단을 사용하여 테스트 :

DatabaseCleaner.strategy = :truncation 

긴 설명 :

거래 전략은 자바 스크립트 테스트를 잘 작동하지 않습니다 왜냐하면 대부분의 JavaScript 가능 capybara 드라이버는 응용 프로그램 코드와 다른 스레드에서 테스트를 실행하기 때문입니다.

다음은 과정의 기본 개요입니다 :

  • 카피 바라가 부팅 백그라운드 스레드에서에 WEBrick 또는 얇은를 사용하여 랙 응용 프로그램을.
  • 주 스레드가 드라이버를 설정하여 랙 응용 프로그램이 실행되고있는 포트를 제공합니다.
  • 테스트에서 드라이버와 응용 프로그램의 상호 작용을 요청하면 가짜 웹 브라우저가 응용 프로그램에 대한 요청을 수행합니다.

인 메모리 랙 응용 프로그램에 대한 요청을 수행하는 가짜 브라우저를 만들기가 어렵 기 때문에 이는 필수입니다. 일부 데이터베이스 드라이버에서는 동일한 트랜잭션에 대해 여러 스레드에서 쿼리를 수행하는 것이 안전하지 않습니다.

결과적으로 응용 프로그램 코드에서 데이터를 볼 수 있도록 테스트 코드에서 트랜잭션을 커밋해야합니다. 이를 수정하는 가장 쉬운 방법은 truncation database cleaner 전략을 사용하는 것입니다.

JavaScript 테스트를 제외한 모든 것에 트랜잭션을 사용하도록 RSpec (또는 오이)을 구성 할 수 있습니다. JavaScript 테스트를 위해 일하는 동안 비 자바 스크립트 테스트의 경우 더 빠릅니다.http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

0

오이에서는 트랜잭션 기반 시작이 작동하지 않습니다. 그 이유는 두 개의 별도 프로세스가 실행 중이라는 것입니다. 하나는 앱 서버를 실행하고 다른 하나는 실제 요청을 실행하는 것입니다. 이것 주위에는 여러 가지 방법이 있지만 더러운 해킹입니다. 깨끗한 솔루션은 DatabaseCleaner 전략처럼 잘라내기를 사용하는 것입니다.

DatabaseCleaner.strategy = :truncation 

Before do 
    DatabaseCleaner.clean_with :truncation 
end 
+2

그것은 트랜잭션 전략 오이 작동하지 않는 말을 잘못입니다 :

Avdi 그림 형제는 세부에서 솔루션을 설명하는이 주제에 대한 좋은 블로그 게시물이 있습니다. 그것은 당신이 사용하고있는 Capybara 드라이버에 달려 있습니다. 랙 테스트를 통해 모든 것이 진행 중이므로 트랜잭션 전략이 제대로 작동해야합니다. –

+0

Andy 당신 말이 맞습니다. @ javascript가 항상 활성화되어 있으므로 오래된 랙 테스트를 완전히 잊어 버렸습니다. – svyatogor