我正在尝试为看似相对简单的测试编写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
但我再次找到关于使用或子句的文档。
谢谢!
答案 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
我不确定该条款。