У меня проблема с тестированием методов, которые соответствуют столбцам базы данных 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 сделал свою инициализацию?