Как заглушить методы ActiveRecord :: Base, не делая предположений о том, как он используется? - PullRequest
9 голосов
/ 15 марта 2012

ActiveRecord::Base имеет большой старый API с несколькими методами для поиска и сохранения объектов.Например, ваши AR::B объекты могут быть созданы из нескольких методов:

  • Foo.new(…)
  • Foo.create(…)
  • Foo.find(…)
  • Foo.find_by_sql(…)
  • Foo.find_[all_]by_*(…)
  • bar.foos (ассоциации)
    • … и методы поиска на ассоциации, конечно

Аналогично, рассматриваемый объект может сохраняться несколькими различными способами:

  • foo.create или foo.create!
  • foo.save или foo.save!
  • foo.update_attributes или foo.update_attributes!

Теперь при написании модульных тестов рекомендуется заглушать вызовы внешних методов, чтобы ваш тест могсосредоточиться на бизнес-логике рассматриваемого метода.Тем не менее, когда дело доходит до работы с AR::B объектами - например, в модульных тестах контроллера - кажется, что вы должны выполнить один из вышеперечисленных методов, когда на самом деле, что касается бизнес-логики метода, это не должноне важно, какой вы выберете.

Вам нужно так тесно связать поведение вашего метода с его реализацией или я упустил что-то простое?

1 Ответ

3 голосов
/ 15 марта 2012

Один из подходов состоит в том, чтобы создать ваши классы таким образом, чтобы вы завершили любые вызовы ActiveRecord::Base методов в своих собственных методах.

Поэтому вместо непосредственного вызова Foo.new(…) ...

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

Таким образом, в ваших тестах вы можете использовать собственные методы вместо ActiveRecord.

Этот подход (включая его «преимущества») подробно описан Авди Гриммом в книге «Объекты на рельсах».... http://objectsonrails.com

...