10

Używam Cucumber do pisania testów integracyjnych i Database Cleaner, aby dbać o czystość mojego db. Wszystko działa idealnie, ponieważ moje testy nie wymagają obsługi Javascript.Problem z bazą danych Cleaner z Capybara Webkit

Mogę sprawić, by te ostatnie testy przeszły za pomocą Capybara webkit, ale moja baza danych nie jest w ogóle czyszczona.

Oto moja funkcje/support/env.rb file:

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 

Próbowałem coś podobnego do this, aby sprawdzić, który sterownik jest używany przez Kapibara, ale to nie działa. Próbowałem też hacka wspomnianego w trzeciej części this post, ale potem nic nie działało ...

Naprawdę nie wiem, jak to osiągnąć i każda pomoc byłaby bardzo cenna.

Z góry dziękuję.

Odpowiedz

22

Szybka odpowiedź:

Konfiguracja JavaScript testuje użyć obcinanie zamiast transakcji:

DatabaseCleaner.strategy = :truncation 

Dłuższe wyjaśnienie:

Strategia transakcja nie działa dobrze z testów JavaScript , ponieważ większość sterowników kapibara zdolnych do JavaScriptu uruchamia testy w innym wątku niż kod aplikacji.

Oto podstawowy zarys procesu: Buty

  • Kapibara zapasowa aplikacji stelażu przy użyciu serwer WEBrick lub cienki w wątku tła.
  • Główny wątek ustawia sterownik, zapewniając port, na którym działa aplikacja stojaka.
  • Twoje testy wymagają od kierowcy interakcji z aplikacją, co powoduje, że fałszywa przeglądarka internetowa wykonuje żądania związane z aplikacją.

Jest to konieczne, ponieważ trudno jest zrobić fałszywą przeglądarkę, która wykonuje żądania wobec aplikacji do pamięci w pamięci. W niektórych sterownikach baz danych nie jest bezpiecznie wykonywać kwerendy z wielu wątków przeciwko tej samej transakcji.

Rezultatem jest to, że musisz zatwierdzić transakcje w kodzie testowym, aby dane były widoczne w kodzie aplikacji. Najprostszym sposobem rozwiązania tego problemu jest użycie strategii czyszczenia bazy danych dotyczącej obcięcia.

Możesz skonfigurować RSpec (lub Ogórek), aby używać transakcji do wszystkich prócz testów JavaScript. Będzie to szybsze w przypadku testów niezwiązanych z JavaScriptem, a jednocześnie będzie działało w testach JavaScript.

Avdi Grimm ma dobrą blogu na ten temat, który opisuje rozwiązanie w szczegółach: http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

0

Startegie oparte na transakcji nie działają z ogórkiem. Powodem tego jest to, że masz uruchomione dwa oddzielne procesy, jeden uruchamia serwer aplikacji, a drugi wykonuje rzeczywiste żądania. Są na to różne sposoby, ale są to brudne hacki. Oczywistym rozwiązaniem jest użycie skrótu w strategii DatabaseCleaner.

DatabaseCleaner.strategy = :truncation 

Before do 
    DatabaseCleaner.clean_with :truncation 
end 
+2

To jest błędne powiedzieć, że strategie transakcyjne nie działają z ogórkiem. Zależy od tego, jakiego używasz sterownika Capybara. Dzięki testowi rack wszystko jest w toku, więc strategia transakcji powinna działać. –

+0

Andy masz rację. Ponieważ mam włączoną funkcję @javascript przez cały czas, całkowicie zapomniałem o starym sprawdzianu rackowym. – svyatogor