2009-06-02 9 views
7

Jestem obecnie w trakcie rozpoczynania migracji od urządzeń do fabryk i uruchamiania niektórych testów baz danych.Jak uzyskać bazę danych testów Rails do przebudowania przed każdym testem?

Po uruchomieniu całego zestawu testów baza danych jest czyszczona, a nowe dane generowane fabrycznie są ponownie ładowane. Jednak po uruchomieniu poszczególnych testów jednostkowych baza danych nie wyczyści starych wartości.

Mogę uruchomić prowizję db: test: przygotuj się przed każdym indywidualnym testem, ale to spowolniłoby mój rozwój.

Oto moje ustawienia testowe:

self.use_transactional_fixtures = false 
    self.use_instantiated_fixtures = true 

Na przykład:

require File.dirname(__FILE__) + '/../test_helper' 
class LocationTest < ActiveSupport::TestCase 
    test "should require name to save" do 
    location = Factory.create(:location) 
    end 
end 

będą prowadzone raz pomyślnie lecz nie na kolejnych przebiegów pliku testowego. To nigdy wcześniej się nie zdarzyło, ponieważ urządzenia testowe ładowały się przy każdym uruchomieniu.

Dodałem sekwencjonowanie fabryki, ale to tylko sekwencje atrybutów podczas każdego biegu:

Factory.define :location do |l| 
    l.sequence(:name) {|n| "place#{n}"} 
    l.street '123 N Pitt Street' 
    l.state_id 4 
    l.city 'San Francisco' 
    l.location_type_id LocationType::COMMON 
    l.shipper_id 1 
    l.zip 23658 
    end 

skutkuje:

trunk>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
. 
Finished in 0.162 seconds. 

1 tests, 0 assertions, 0 failures, 0 errors 

>ruby test\unit\location_test.rb 
Loaded suite test/unit/location_test 
Started 
E 
Finished in 0.134 seconds. 

    1) Error: 
test_should_require_name_to_save(LocationTest): 
ActiveRecord::RecordInvalid: Validation failed: Name has already been taken 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/proxy/create.rb:5:in `result' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:293:in `run' 
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:237:in `create' 
    test/unit/location_test.rb:18:in `test_should_require_name_to_save' 

1 tests, 0 assertions, 0 failures, 1 errors 

Odpowiedz

1

Najpierw sprawdź ustawienia testowe, aby upewnić się, że są one zgodne z oczekiwaniami, chociaż podejrzewam, że możesz mieć powód, aby uniemożliwić standardową praktykę przeprowadzania testu w transakcji (która jest wycofywana po wyjściu).

Inne opcje to (1) Ręczne wykorzystywać transakcje na testach takich jak ten powyżej (tam gdzie nie ma już transakcji), plus (2) Dodać metodę teardown ręcznie wyczyścić odpowiednie tabele.

+1

Dodaj: self.use_transactional_fixtures = true dla tej klasy i to działa! Dziękuję Ci. Tak, istnieją powody, dla których nie mogę go zmienić na całe środowisko. Nawet nie pomyślałem, żeby to zmienić tylko na jeden test ... doh! Jeszcze raz dziękuję. –

0

Można zastąpić metodę setup w badanej jednostki tak, że usuwa dane, które chcesz wyczyścić.

0

Ponieważ każda próba powinny zacząć od czystej bazy danych, spróbuj dostać rzeczy w swoim kodzie do punktu, w którym może transakcje użytku dla każdego testu. Twoja jakość testu zostanie znacznie poprawiona.

Co więcej, nie jest to bezpośrednio związane z twoim pytaniem ... ale nigdy nie używaj urządzeń Railsowych w żadnych okolicznościach. Zamiast tego użyj fabryk (sprawdź gem gem_girl_rails). Sprawdź także RSpec zamiast Test :: Unit.

Powiązane problemy