2

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

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

我的第一个问题是遍历所有模型——如何在 RSpec 中做到这一点?我通常可以遍历模型,例如:

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

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

我的第二个问题是关于“OR”子句的——如何实现“对所有者或所有者的响应”?就像是:

model.should respond_to :owner || :owners

但同样我找不到太多关于 using or 子句的文档。

4

2 回答 2

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您应该测试它是否响应正确的一个。即使这意味着为每个模型创建一个规范(无论如何你都应该有)并添加一个新的例子,从长远来看,你最好是具体的。它还可以帮助您的代码的未来维护者,他们希望模型规范位于模型本身的规范文件中,而不是在包罗万象的规范中。

在这种情况下,示例非常小——对于较长的示例,您可能会考虑使用共享示例来稍微干燥一下。

于 2012-11-01T00:54:50.793 回答
1

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

it "every model should respond to owners" do

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

end

我不确定 or 子句。

于 2012-10-31T21:43:45.910 回答