Wie stubst du ActiveRecord :: Base-Methoden, ohne Annahmen darüber zu machen, wie sie verwendet werden?

8

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)
    • ... und Finder Methoden auf Assoziationen, natürlich

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?

    
Gareth 15.03.2012, 11:32
quelle

1 Antwort

3

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 ...

%Vor%

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 ... Ссылка

    
Paul Sturgess 15.03.2012, 13:39
quelle