ActiveRecord::Base
hat eine große API mit mehreren Methoden zum Suchen und Speichern von Objekten. Zum Beispiel könnten Ihre AR::B
-Objekte aus einer Reihe von Methoden instanziiert worden sein:
Foo.new(…)
Foo.create(…)
Foo.find(…)
Foo.find_by_sql(…)
Foo.find_[all_]by_*(…)
bar.foos
(Assoziationen)
In ähnlicher Weise kann das Objekt durch einige verschiedene Methoden erhalten bleiben:
foo.create
oder foo.create!
foo.save
oder foo.save!
foo.update_attributes
oder foo.update_attributes!
Wenn Sie Komponententests schreiben, empfiehlt es sich, externe Methodenaufrufe zu verarbeiten, damit sich der Test auf die Geschäftslogik der betreffenden Methode konzentrieren kann. Wenn es jedoch darum geht, mit AR::B
objects zu arbeiten - zum Beispiel in Controller-Unit-Tests - scheint es, als ob Sie sich einer der oben genannten Methoden verpflichten müssen, wenn es tatsächlich um die Geschäftslogik der Methode geht. t wichtig sein, die Sie wählen.
Müssen Sie das Verhalten Ihrer Methode so eng mit ihrer Implementierung verbinden oder fehlt mir etwas Einfaches?
Ein Ansatz besteht darin, Ihre Klassen so zu erstellen, dass Sie alle ActiveRecord::Base
-Methodenaufrufe in Ihren eigenen Methoden einschließen.
Also anstatt Foo.new(…)
direkt aufzurufen ...
Auf diese Weise können Sie in Ihren Tests anstelle von ActiveRecord eigene Methoden ausgeben.
Dieser Ansatz (einschließlich seiner Vorteile) wird ausführlich von Avdi Grimm in dem Buch "Objects On Rails" beschrieben ... Ссылка
Tags und Links unit-testing ruby-on-rails activerecord stubbing