【发布时间】:2010-04-20 00:08:02
【问题描述】:
在我的一个模型中,我使用一些元编程来动态定义一些方法。我想测试一下;因此,我需要一种紧凑的方法来断言我的模型具有具有特定名称的可读/可写属性。想法?
如果有什么不同,我会使用 shoulda 进行单元测试。
【问题讨论】:
标签: ruby-on-rails ruby unit-testing metaprogramming shoulda
在我的一个模型中,我使用一些元编程来动态定义一些方法。我想测试一下;因此,我需要一种紧凑的方法来断言我的模型具有具有特定名称的可读/可写属性。想法?
如果有什么不同,我会使用 shoulda 进行单元测试。
【问题讨论】:
标签: ruby-on-rails ruby unit-testing metaprogramming shoulda
你也许可以使用 should_have_instance_methods 或 should_have_class_methods shoulda 宏 - 我没有尝试过这个用例,它们可能依赖于您的对象具有 ActiveRecord::Base 的超类
respond_to 呢?
o = some_dynamic_object()
assert(o.respond_to?(:method_x)) # getter
assert(o.respond_to?("method_x=".to_sym) # setter
【讨论】:
有几种方法,具体取决于它的定义方式。如果您正常定义它(以某种方式在eval 或class_eval 中定义def 或define_method),那么您可以使用defined? obj.prop 来确保它响应读者(作家没有等价物)。您也可以使用obj.respond_to? :prop 作为读者,obj.respond_to? :prop= 作为作者。
如果您使用method_missing 来模拟对该属性的调用,那么obj.respond_to? 仅在您重新定义它时才有效(在这种情况下您需要单独测试它),并且是唯一的测试方法您的属性是尝试从中读取和写入,并断言它不会引发任何异常。
【讨论】: