55 Stimmen

Rails: Wie testet man Code im lib/-Verzeichnis?

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?

30voto

Matt Haley Punkte 4234

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.

23voto

Paul Carey Punkte 1678

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 }

8voto

ae35unit Punkte 148

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!

3voto

jpgeek Punkte 4631

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.

3voto

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 .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X