2009-04-28 16 views
41

Mam model, który pobiera swoje dane z obiektu analizatora składni. Myślę, że klasa parser powinna żyć w katalogu lib/(chociaż można mnie przekonać, że powinna żyć gdzieś indziej). Pytanie brzmi: Gdzie powinna znajdować się moja jednostka testująca dla klasy parsera? A jak mogę się upewnić, że są uruchamiane za każdym razem, gdy uruchamiam test prowizji?Szyny: Jak przetestować kod w katalogu lib /?

Odpowiedz

24

W aplikacji Rails, nad którą pracuję, postanowiłem po prostu umieścić testy w katalogu test\unit. Ja też je przez gniazdo modułu/katalogu, a także, na przykład:

lib/a.rb => test/unit/a_test.rb 
lib/b/c.rb => test/unit/b/c_test.rb 

Dla mnie to była ścieżka ostatniego oporu, jak te badania prowadził bez konieczności dokonywania jakichkolwiek innych zmian.

+2

To już nie działa z Railsami 5 – Qqwy

20

Oto jeden ze sposobów:

Tworzenie lib/tasks/test_lib_dir.rake z następującym

namespace :test do 

    desc "Test lib source" 
    Rake::TestTask.new(:lib) do |t|  
    t.libs << "test" 
    t.pattern = 'test/lib/**/*_test.rb' 
    t.verbose = true  
    end 

end 

naśladować strukturę swojej lib reż pod test dir, zastępując kod lib z odpowiednich testów.

Uruchom rake test:lib, aby uruchomić testy lib.

Jeśli chcesz, aby wszystkie testy były uruchamiane po wywołaniu rake test, możesz dodać następujące elementy do nowego pliku rake.

lib_task = Rake::Task["test:lib"] 
test_task = Rake::Task[:test] 
test_task.enhance { lib_task.invoke } 
+0

W jakiś sposób nie ładuje środowiska (w szczególności 'ActiveSupport'' fixtures') i nie ma sposobu, aby zmusić go do rakefile. –

+1

Hej, próbowałem twojego rozwiązania i 'test rake: lib' uruchamia mój test, ale' test rake'a 'nie działa. Skopiowałem to dosłownie. Oto link do mojej zawartości pliku: http://pastebin.com/FHMXU6vG Z góry dziękuję! – robert

8

Szukałem zrobić to samo, ale z rspec & Autospec i zajęło trochę kopania, aby dowiedzieć się dokładnie tam, gdzie były one coraz listę wzorców katalogów/plików, które podyktowane które pliki testowe do uruchomienia. Ostatecznie znalazłem to w lib/zadań/rspec.rake: 86

[:models, :controllers, :views, :helpers, :lib, :integration].each do |sub| 
    desc "Run the code examples in spec/#{sub}" 
    Spec::Rake::SpecTask.new(sub => spec_prereq) do |t| 
     t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""] 
     t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"] 
    end 
    end 

I umieścił moje testy w nowym katalogu Spec/libs gdy plik rpsec.rake został skonfigurowany wyglądać w specyfikacji/lib. Po prostu zmiana nazwy bibliotek -> lib załatwił sprawę!

+0

Mam domyślnie '/ lib' w moim projekcie. Niestety, 'test rake'u 'nie nadciąga plików, więc jest to tylko RSpec i muszę użyć powyższego rozwiązania. –

0

Aby nie definiować dodatkowych zadań rake w celu uruchamiania testów z niestandardowych zdefiniowanych folderów, można również uruchomić je za pomocą polecenia rake test:all. Struktura folderów testów dla folderu lib lub dowolnego innego folderu niestandardowego zależy od Ciebie. Ale wolę kopiować je w klasach: lib jest dopasowany do test/lib, app/form_objects do test/form_objects.

3

Łatwy i czysty sposób polega na utworzeniu katalogu pod kontrolą test/unit/lib. Następnie stwórz test jako test/unit/lib/foo_test.rb odpowiadający lib/foo.rb. Żadne nowe zadania rake'u nie są wymagane i możesz zagnieździć więcej katalogów, jeśli jest to konieczne, aby dopasować strukturę katalogów lib.

-2

Zastosowanie:

[spring] rake test:all 

uruchomić wszystkie testy, w tym utworzonych katalogów (jak [root]/test/lib/).

Pomiń [spring], jeśli tou go nie używa.

+0

rake przerwany! Nie wiem, jak zbudować zadanie "test: wszystko" – Intentss

3

Od Rails 4.0:

rake test:all   # Run all tests in any subdir of `test` without resetting the DB 
rake test:all:db  # Same as above and resets the DB 

Od Rails 4.1, przedefiniować test:run o dodatkowe zadania podczas uruchamiania rake lub rake test:

# lib/tasks/test.rake 

namespace :test do 
    Rake::Task["run"].clear 
    task run: ["test:units", "test:functionals", "test:generators", "test:integration", "test:tasks"] 

    ["tasks"].each do |name| 
    Rails::TestTask.new(name => "test:prepare") do |t| 
     t.pattern = "test/#{name}/**/*_test.rb" 
    end 
    end 
end 

To ma dodatkowy bonus definiowania rake test:tasks w podanym przykładzie .

Od Rails 4.2, test:run obejmuje wszystkie podkatalogów z test tym ich podczas pracy rake test, a tym samym rake.

+0

W Railsach 5 te różne zadania już nie istnieją. – Qqwy

Powiązane problemy