在我的一个模型中,我正在使用一些元编程来动态定义一些方法。我想测试一下;因此,我需要一种紧凑的方式断言我的模型具有可读/可写的属性,具有特定的名称。想法?
如果它有所作为,我正在使用shoulda进行单元测试。
答案 0 :(得分:3)
您可以使用 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
答案 1 :(得分:2)
有几种方法,具体取决于它的定义方式。如果您在def
或define_method
中正常定义(某种方式eval
或class_eval
),那么您可以使用defined? obj.prop
来确保它对读者有所回应(作家没有相应的东西)。您还可以为阅读器使用obj.respond_to? :prop
,为作者使用obj.respond_to? :prop=
。
如果您使用method_missing
来模仿对该属性的调用,则obj.respond_to?
仅在您重新定义该属性时才会起作用(在这种情况下您需要单独测试),并且测试你的属性的唯一方法是尝试从它读取并写入它,并断言它不会抛出任何异常。