如何断言模型具有可读/可写属性?

时间:2010-04-20 00:08:02

标签: ruby-on-rails ruby unit-testing metaprogramming shoulda

在我的一个模型中,我正在使用一些元编程来动态定义一些方法。我想测试一下;因此,我需要一种紧凑的方式断言我的模型具有可读/可写的属性,具有特定的名称。想法?

如果它有所作为,我正在使用shoulda进行单元测试。

2 个答案:

答案 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)

有几种方法,具体取决于它的定义方式。如果您在defdefine_method中正常定义(某种方式evalclass_eval),那么您可以使用defined? obj.prop来确保它对读者有所回应(作家没有相应的东西)。您还可以为阅读器使用obj.respond_to? :prop,为作者使用obj.respond_to? :prop=

如果您使用method_missing来模仿对该属性的调用,则obj.respond_to?仅在您重新定义该属性时才会起作用(在这种情况下您需要单独测试),并且测试你的属性的唯一方法是尝试从它读取并写入它,并断言它不会抛出任何异常。