тестирование для method_defined? на ActiveRecord классы не работают до момента создания - PullRequest
3 голосов
/ 04 ноября 2011

У меня проблема с тестированием методов, которые соответствуют столбцам базы данных ActiveRecord.Возьмите любую модель, которая у вас есть (в моем случае Document), и сделайте следующее:

$  rails c
Loading development environment (Rails 3.0.9)
>> Document.method_defined?(:id)
=> false
>> Document.new
=> #<Document id: nil, feed_id: nil >
>> Document.method_defined?(:id)
=> true

Очевидно, что в качестве предварительного условия для .new (), добавляющего всю базу данных, идет работа над жизненным циклом ActiveRecord.столбцы как методы для класса.

Когда это действительно усложняет ситуацию, это во время модульного тестирования.Я хотел бы иметь класс, который во время выполнения принимает классы ActiveRecord и выполняет некоторую проверку для них

Например

class Foo < ActiveRecord::Base
  def work1
    # something
  end
end
class Command
  def operates_on(clazz, method)
    # unless I add a "clazz.new" first, method_defined? will fail 
    # on things like :id and :created_at
    raise "not a good class #{clazz.name}" if ! clazz.method_defined?(method)
    # <logic here>
  end
end

describe Command do
  it "should pass if given a good class" do
    Command.new.operates_on(Foo,:work1)
  end
  it "should pass if given a database column" do
    # this FAILS
    Command.new.operates_on(Foo,:id)
  end
  it "should raise if given an invalid class/method combo" do
    lambda { Command.new.operates_on(Foo,:non_work) }.should raise_error
  end
end

Что я могу сделать, чтобы утверждать (кроме создания нежелательного экземпляра с.new ()) что ActiveRecord сделал свою инициализацию?

1 Ответ

6 голосов
/ 16 августа 2012

Это похоже на ошибку, но вряд ли будет исправлено в ближайшее время.

Несовместимый method_defined?Поведение

Я обнаружил, что .attribute_method?работает над классом, чтобы делать то, что вам нужно.Вы можете найти больше информации в ActiveRecord :: AttributeMethods :: ClassMethods

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...