In Anbetracht , dass ich eine habe Personable
Sorge in meinem Rails 4 - Anwendung , die eine hat full_name
Methode, wie würde ich mich über diese mit RSpec testen?
Anliegen / personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
ruby-on-rails
testing
rspec
Kyle Decot
quelle
quelle
ActiveSupport::Concern
aus Rails genommen? Ich dachte, es ist eine Weile her.Antworten:
Die Methode, die Sie gefunden haben, funktioniert sicherlich, um ein wenig Funktionalität zu testen, scheint aber ziemlich fragil zu sein - Ihre Dummy-Klasse (eigentlich nur eine
Struct
in Ihrer Lösung) kann sich wie eine echte Klasse verhalten oder nicht, dieinclude
Ihr Anliegen ist. Wenn Sie versuchen, Modellprobleme zu testen, können Sie die Gültigkeit von Objekten nicht testen oder ActiveRecord-Rückrufe aufrufen, es sei denn, Sie richten die Datenbank entsprechend ein (da Ihre Dummy-Klasse keine Datenbanktabellenunterstützung hat es). Darüber hinaus möchten Sie nicht nur das Problem testen, sondern auch das Verhalten des Unternehmens in Ihren Modellspezifikationen testen.Warum also nicht zwei Fliegen mit einer Klappe schlagen? Mithilfe der gemeinsam genutzten Beispielgruppen von RSpec können Sie Ihre Bedenken anhand der tatsächlichen Klassen testen, die sie verwenden (z. B. Modelle), und Sie können sie überall dort testen, wo sie verwendet werden. Und Sie müssen die Tests nur einmal schreiben und sie dann einfach in jede Modellspezifikation aufnehmen, die Ihr Anliegen verwendet. In Ihrem Fall könnte dies ungefähr so aussehen:
Die Vorteile dieses Ansatzes werden noch deutlicher, wenn Sie anfangen, Dinge in Ihrem Anliegen zu tun, wie das Aufrufen von AR-Rückrufen, bei denen weniger als ein AR-Objekt einfach nicht funktioniert.
quelle
parallel_tests
. Ich denke, es ist besser, separate Tests zu haben, alsshared_examples_for
und zu verwendenit_behaves_like
.parallel_tests
basieren sie auf Dateien. Gemeinsame Beispiele sollten dies also nicht verlangsamen. Ich würde auch argumentieren, dass richtig gruppierte gemeinsame Verhaltensweisen die Testgeschwindigkeit übertrumpfen.concerns
Verzeichnis in Ihremspec_helper.rb
github.com/rspec/rspec-core/issues/407#issuecomment-1409871_spec
Fügen Sie nicht den Dateinamen hinzu , der shared_examples_for enthält (in diesem Fall personable_spec.rb), da sonst eine irreführende Warnmeldung angezeigt wird - github.com/rspec/rspec-core/issues/828 .Als Antwort auf die Kommentare, die ich erhalten habe, habe ich Folgendes getan (wenn jemand Verbesserungen hat, kann er diese gerne posten) :
spec / Anliegen / personable_spec.rb
quelle
Person
. Ich werde bearbeiten, um zu beheben.undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
Ein anderer Gedanke ist, das Juwel with_model zu verwenden, um solche Dinge zu testen. Ich wollte selbst ein Problem testen und hatte gesehen, wie das Juwel pg_search dies tat . Es scheint viel besser zu sein als das Testen einzelner Modelle, da sich diese möglicherweise ändern, und es ist schön, die Dinge zu definieren, die Sie in Ihrer Spezifikation benötigen.
quelle