Как я могу утверждать, что модель имеет атрибут для чтения / записи? - PullRequest
0 голосов
/ 20 апреля 2010

В одной из моих моделей я использую метапрограммирование для динамического определения некоторых методов. Я хотел бы проверить это; таким образом, мне нужен компактный способ утверждать, что моя модель имеет атрибут для чтения / записи с определенным именем. Идеи?

Я использую musta для модульного тестирования, если это имеет значение.

Ответы [ 2 ]

3 голосов
/ 20 апреля 2010

вы можете использовать must_have_instance_methods или should_have_class_methods shoulda макросы - я не пробовал для этого варианта использования, и они могут полагаться на ваш объект, имеющий суперкласс ActiveRecord :: Base

как насчет ответить_то?

o = some_dynamic_object()
assert(o.respond_to?(:method_x)) # getter
assert(o.respond_to?("method_x=".to_sym) # setter
2 голосов
/ 20 апреля 2010

Есть несколько способов, в зависимости от того, как это определено. Если вы определили его как обычно (как-то def или define_method в eval или class_eval), то вы можете использовать defined? obj.prop, чтобы убедиться, что он отвечает читателю (для писателя нет эквивалента). Вы также можете использовать obj.respond_to? :prop для читателя и obj.respond_to? :prop= для писателя.

Если вы используете method_missing для имитации вызова для свойства, то obj.respond_to? будет работать только в том случае, если вы также изменили это значение (в этом случае вам нужно проверить его отдельно), и единственный способ проверить ваша собственность - пытаться читать из нее и писать в нее, и утверждать, что она не вызывает никаких исключений.

...