2011-07-20 8 views
6

Mam dziwną sytuację, w której jeśli uruchomię indywidualny plik specyfikacji modelu rspec wszystkie przykłady są zielone, jeśli przetestuję cały katalog specyfikacji/modeli, wszystkie moje przykłady są zielone. Jeśli przetestuję kontrolery, wszystkie przekażą kolor zielony. Jeśli przetestuję cały pakiet (przez specyfikację rspec), otrzymam awarie - Jeśli usuniemy testy kontrolera, wszystko będzie zielone. Teraz spodziewam się, że jest to całkowicie samowystarczalne, ale nie mogę tego pojąć.Testowanie całego pakietu Rspec kończy się niepowodzeniem

Zawęziłem to do konkretnych przykładów w testach kontrolera - które sprawiają, że przykłady w specyfikacji modelu zawodzą.

np. w notes_controller_spec.rb jeśli linia ta jest obecna

Note.any_instance.stubs(:valid?).returns(false) 

powoduje awarię w moich modelach/account_spec.rb

Failure/Error: @account.all_notes.should have(2).notes 
ArgumentError: 
comparison of Note with Note failed 
./app/models/account.rb:293:in `sort' 

gdzie jest linia 293;

(self.notes + self.transactions.map(&:notes).flatten).sort {|a,b| a.created_at <=> b.created_at } 

Jestem prawie pewny, że to będzie jedna z tych chwil na twarzy, więc bądź dla mnie łagodny!

+0

'' created_at' mogą być zerowe dla jednej Obligacji, który oznacza, że ​​blok sortowania byłoby porównanie '' zerowe przeciwko Fixnum', co spowodowałoby, że blok zwróciłby 'nil', co spowodowałoby wysadzenie w rodzaju" ArgumentError ", który widzisz.Czy na pewno wszystkie twoje instancje zostały zapisane w bazie danych po uruchomieniu tego wiersza? Czy to możliwe, że baza danych nie jest opróżniana przed każdym przykładem? –

+0

Mam podobny problem. Mam wrażenie, że może to być związane z [tym problemem rspec] (https://github.com/rspec/rspec-mocks/issues/54), chociaż twierdzi, że zostało naprawione. –

+0

Przepraszam, przypadkowo trafiłam enter, więcej szczegółów: Zajmuję się metodą na każdym wystąpieniu modelu - innym modelem niż ten, który testuję w konkretnym zestawie testów. Kiedy uruchomię inny zestaw testów, które wymagają tej metody, nie zostanie znaleziony. Usunięcie kodu w testach w jednym pliku powoduje przejście drugiego pliku. Naprawdę denerwujące. Eksperymentowałem z instalowaniem różnych wersji oprogramowania rspec. –

Odpowiedz

1

Czy robisz jakieś ustawienia daty w przeszłości: wszystkie bloki? Nie są to transakcje i mogą powodować problemy z zanieczyszczeniem testowym.

Także myślę, że składnia może być wyłączony tutaj:

Note.any_instance.stubs(:valid?).returns(false) 

Powinno być:

Note.any_instance.stub(:valid?).and_return(false) 
0

jakie miałem podobne problemy z RSpec 3 i Rails 4.1. Ilekroć samodzielnie uruchamiałem problematyczny plik spec, przeszedł, a uruchomienie całego pakietu spowodowałoby awarię.

W moim przypadku było to w jakiś sposób związane ze strefami czasowymi. Wyraźnie ustawiłem strefę czasową w ApplicationController iz jakiegoś powodu moja specyfikacja funkcji go nie polubiła. Jeśli nie ustawię strefy czasowej w środowisku testowym, wszystko przejdzie ponownie. na przykład

unless Rails.env.test? 
    Time.zone = "some timezone value here" 
end 
0

Wystąpił podobny problem: spełnione zostały indywidualne specyfikacje modelu. Podczas uruchamiania całego pakietu modeli miałem około 30 błędów. To, co zrobiłem, to obejrzenie pliku, zanim zdarzyły się wszystkie awarie. Tam znalazłem, że ustawiam rzeczy wewnątrz wątków i używając default_scopes jak w tym railscast.

W poprzedniej klauzuli wydrukowałem Company.current_id. Tak jak myślałem, podczas indywidualnego uruchamiania, Company.current_id był nil. Po uruchomieniu pakietu Company.current_id był 2. Tak dzieje się, gdy używasz domyślnych zakresów. Aby to naprawić, po prostu ustaw Company.current_id na nil w klauzuli before.

Przed

describe Service, type: :model do 
    before do 
    end 
end 

Po

describe Service, type: :model do 
    before do 
    Company.current_id = nil 
    end 
end