2012-03-15 8 views
8

ActiveRecord::Base ha una grande API ol con più metodi per trovare e salvare oggetti. Ad esempio, i AR::B oggetti potrebbero essere stati istanziato da una serie di metodi:Come si disattivano i metodi ActiveRecord :: Base senza fare supposizioni su come vengono utilizzati?

  • Foo.new(…)
  • Foo.create(…)
  • Foo.find(…)
  • Foo.find_by_sql(…)
  • Foo.find_[all_]by_*(…)
  • bar.foos (associazioni)
    • ... e finder metodi su associazioni, naturalmente

Allo stesso modo, l'oggetto in questione potrebbe avere persistito da alcuni metodi differenti:

  • foo.create o foo.create!
  • foo.save o foo.save!
  • foo.update_attributes o foo.update_attributes!

Ora, durante la scrittura dei test di unità, è consigliabile interrompere le chiamate di metodo esterne in modo che il test possa concentrarsi sulla logica di business del metodo in questione. Tuttavia, quando si tratta di lavorare con gli oggetti AR::B - ad esempio nei test dell'unità controller - sembra che tu debba impegnarsi in uno dei metodi sopra elencati, quando in realtà per quanto riguarda la logica di business del metodo non dovrebbe essere importante che scegli.

Devi accoppiare questo comportamento con la sua implementazione o mi manca qualcosa di semplice?

risposta

3

Un approccio è quello di creare le classi in modo tale da concludere tutte le chiamate al metodo ActiveRecord::Base con i propri metodi.

Così, invece di chiamare direttamente Foo.new(…) ...

class Foo < ActiveRecord::Base 
    def self.create_object(…) 
    new(…) 
    end 
end 

In questo modo nei test si può spegnere i propri metodi, invece di ActiveRecord di.

Questo approccio (comprese le sue prestazioni) è delineato in dettaglio da Avdi Grimm nel libro 'Oggetti On Rails' ... http://objectsonrails.com