0

我正在尝试做一个 DRY cucumber 功能,但我遇到了将字符串转换为 ActiveRecord 模型名称的问题

Given /^the following "(.+)" exist:/ do |mod, table|
  table.hashes.each do |t|
   mod.create!(t)
  end
  assert mod.all.count == table.hashes.size
end

这给了

undefined method `create!' for "Balloon":String (NoMethodError)

更优雅的解决方案可能是使用工厂,但我想知道是否可以使用上述方法?

4

1 回答 1

2

您可以查看constantize哪个将 String 转换为 constant。尝试:

"Balloon".constantize.create!(t)

但是:在 Cucumber 步骤中使用您的应用程序代码(特别是模型)是代码异味。你的集成测试根本不应该依赖于被测代码——当你实现 Cucumber 步骤时,把你的应用程序想象成一个黑盒子。(还可以考虑对模型进行重构,这需要您返回并更改 Cucumber 步骤——这是您走错路的第一个线索!)

您可以做些什么来改进这一点是使用 API 创建模型(如果您的应用程序实现了一个)。

这样,您只依赖应用程序中面向公众的那些部分。

另一方面:Given不应该有一个断言,它更像是beforeRSpec 中的一个钩子,为以后的断言设置一个条件......

于 2013-04-01T21:07:17.240 回答