RSpec测试是否所有模型都是respond_to属性

时间:2012-10-31 21:22:41

标签: ruby-on-rails ruby-on-rails-3 unit-testing rspec

我正在尝试为看似相对简单的测试编写RSpec测试,但它证明非常棘手(尽管我是RSpec的新手)。

简单来说,我想测试我的应用程序中的所有模型respond_to:owner或:owner。

我的第一个问题是循环遍历所有模型 - 如何在RSpec中执行此操作?我通常可以循环遍历模型:

ActiveRecord::Base.descendants.each { |model|
    model.should respond_to :owner
}

但不确定如何在RSpec中正确执行此操作?我找不到很多关于在测试中使用循环的文档。

我的第二个问题是关于“OR”条款 - 我怎样才能实现“回应所有者或所有者”?类似的东西:

model.should respond_to :owner || :owners

但我再次找到关于使用或子句的文档。

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以通过测试每种方法并汇总答案来完成OR条件:

ActiveRecord::Base.descendants.each do |model|
   instance = model.new
   expected = instance.respond_to?(:owner) || instance.respond_to?(:owners)
   expected.should be_true
end

但这对我来说有点不对劲。如果模型仅响应:owner:owners中的一个,则应测试它是否响应了正确的模型。即使这意味着为每个模型创建一个规范(在任何情况下你应该拥有它)并添加一个新的例子,从长远来看,你最好是具体的。它还可以帮助未来的代码维护人员,他们希望模型规范可以在模型本身的spec文件中,而不是一个包罗万象的规范。

在这种情况下,示例非常小 - 对于较长的示例,您可能会考虑使用shared example稍微干一些事情。

答案 1 :(得分:1)

当您运行Rspec测试时,您仍在使用Ruby。因此,只要您处于it块中,您的循环就可以正常工作。您唯一的问题是您有一个模型对象而不是该对象的实例,因此您需要创建一个。所以一个解决方案是:

it "every model should respond to owners" do

  ActiveRecord::Base.descendants.each { |model|
   model.new.should respond_to :owner
  }

end

我不确定该条款。