Ich habe ein Modell, das seine Daten von einem Parser-Objekt erhält. Ich denke, dass die Parserklasse im Verzeichnis lib/ liegen sollte (obwohl ich davon überzeugt werden könnte, dass sie woanders liegen sollte). Die Frage ist: Wo sollten meine Unit-Tests für die Parserklasse liegen? Und wie stelle ich sicher, dass sie jedes Mal ausgeführt werden, wenn ich rake test starte?
Antworten
Zu viele Anzeigen?In der Rails-Anwendung, an der ich gerade arbeite, habe ich beschlossen, die Tests einfach in der test\unit
Verzeichnis. Ich werde sie auch nach Modul/Verzeichnis verschachteln, zum Beispiel:
lib/a.rb => test/unit/a_test.rb
lib/b/c.rb => test/unit/b/c_test.rb
Für mich war dies der Weg des letzten Widerstands, da diese Tests ohne weitere Änderungen durchgeführt werden konnten.
Hier ist eine Möglichkeit:
erstellen. lib/tasks/test_lib_dir.rake
mit den folgenden
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
Ahmen Sie die Struktur Ihrer lib
du unter dem test
dir, wobei der lib-Code durch entsprechende Tests ersetzt wird.
ausführen. rake test:lib
um Ihre Lib-Tests durchzuführen.
Wenn Sie möchten, dass alle Tests ausgeführt werden, wenn Sie die rake test
können Sie Ihre neue Rake-Datei wie folgt ergänzen.
lib_task = Rake::Task["test:lib"]
test_task = Rake::Task[:test]
test_task.enhance { lib_task.invoke }
Ich wollte dasselbe tun, aber mit rspec und autospec, und ich musste ein wenig suchen, um herauszufinden, woher sie die Liste der Verzeichnisse/Dateimuster bekommen, die vorgeben, welche Testdateien ausgeführt werden sollen. Letztendlich fand ich dies in lib/tasks/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
Ich hatte meine Tests in einem neuen spec/libs-Verzeichnis abgelegt, während die Datei rpsec.rake so konfiguriert war, dass sie in spec/lib gesucht wurde. Einfaches Umbenennen von libs -> lib hat den Trick gebracht!
Ein einfacher und sauberer Weg ist es, ein Verzeichnis unter test/unit/lib anzulegen. Dann erstellen Sie test als test/unit/lib/foo_test.rb entsprechend lib/foo.rb. Es sind keine neuen Rake-Aufgaben erforderlich, und Sie können bei Bedarf weitere Verzeichnisse verschachteln, um die lib-Verzeichnisstruktur anzupassen.
Ab dem 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
Ab dem Rails 4.1 umdefinieren test:run
um zusätzliche Aufgaben bei der Ausführung von rake
o 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
Dies hat den zusätzlichen Vorteil, dass die rake test:tasks
in dem gegebenen Beispiel.
Ab dem Rails 4.2 , test:run
umfasst alle Unterverzeichnisse von test
sie bei der Ausführung einzubeziehen rake test
und somit rake
.
- See previous answers
- Weitere Antworten anzeigen