2011-12-04 12 views
9

Mam kilka specyfikacji, napisanych w RSpec, które testują różne modele. Używam Factory Girl do generowania obiektu do testowania.Test rspec przebiega w izolacji, ale kończy się niepowodzeniem po uruchomieniu z innymi testami.

Teraz najbardziej osobliwa rzecz dzieje:
Kiedy biegnę rspec spec/models/specific_model_spec.rb --- to przechodzi wszystkie testy w tej specyfikacji

Jednak, gdy biegnę rspec spec/models --- każdy sprawdzian w tej specyfikacji nie odnosił się do generowane jest niepoprawne powiązanie (przez fabrykę)

Stowarzyszenie stworzone przez fabrykę jest oczywiście ważne, ponieważ przeprowadzanie testu w izolacji również pokazuje.

Co może być przyczyną tego zachowania?

Aktualizacja:
błąd pojawia się podczas uruchamiania specyfikację wraz z innymi specyfikacjami (błąd jest taki sam dla każdej awarii):

6) StreamItem adds a stream_item to a project and consultant when an engagement is added 
Failure/Error: @project = Factory.create(:project, :name => 'bar') 
Validation failed: Customer is invalid 
# ./spec/models/stream_item_spec.rb:44:in `block (2 levels) in <top (required)>' 

project factory jest testowany w innej specyfikacji i przechodzi w porządku ...

Aktualizacja 2: Odpowiedni kod fabryczny stosowany jest następujący:

Factory.define :manager, :class => User do |f| 
    f.sequence(:email) { |n| "bar#{n}@example.com" } 
    f.password "pass12" 
    f.sequence(:name) { |n| "Erwin#{n}" } 
    f.roles_mask 4 
end 

Factory.define :customer do |f| 
    f.sequence(:name) { |n| "foo customer#{n}" } 
    f.association :last_actor, :factory => :manager 
    f.account_id 1 
end 

Factory.define :project do |f| 
    f.sequence(:name) { |n| "foo project#{n}" } 
    f.association :manager, :factory => :manager 
    f.association :customer, :factory => :customer 
    f.start_date Date.today << 1 
    f.finish_date Date.today >> 2 
    f.status 1 
    f.association :last_actor, :factory => :manager 
    f.account_id 1 
end 
+0

Zobaczmy błędy. –

+0

Dodano błąd. – ErwinM

+0

Dzięki. A twój kod fabryczny? –

Odpowiedz

11

Zwykle oznacza to, że inne specyfikacje pozostawiają pewne dane w bazie danych, które kolidują z późniejszymi połączeniami fabrycznymi. Podejrzewam, że jeśli przyjrzysz się, dlaczego metoda tworzenia fabryki nie powiodła się, zobaczysz, że weryfikacja unikalności nie powiodła się, być może na e-mailu klienta.

Wyłączanie urządzeń transakcyjnych:

# spec_helper.rb 
config.use_transactional_fixtures = false 

i używać database cleaner zamiast. This blog post może również pomóc.

+0

Problem polegał na tym, że niektóre z pozostawionych danych pozostały. Nie w bazie danych, ale w zmiennej globalnej wtyczki. – ErwinM

+3

jak znalazłeś tę zmienną globalną? –

+0

@Thilo Opublikowany przez Ciebie wpis na blogu zniknął na dobre. – jottr

5

RSpec ma teraz "bisect" feature przeznaczony specjalnie do znalezienia tego rodzaju problemu.

Uruchom komendę RSpec, która powoduje awarię z flagą --bisect, a narzędzie RSpec automatycznie wykryje, która kombinacja specyfikacji powoduje tę usterkę.

rspec spec/models --bisect 
+0

Jesteś człowiekiem ratującym życie :) – Uzair

Powiązane problemy