Rails 测试、夹具和 class 加载顺序
Rails tests, fixture & class loading order
我有一个 ActiveRecord class,它的作用域是根据另一个 table.
的内容动态添加的
(简化代码示例)
class Thing < ActiveRecord::Base
Feature.all.each do |feature|
scope feature.name, ->{joins(:feature).where("feature.name = #{feature.name})}
end
end
应用程序 UI 的另一部分是 "Thing display",可让您搜索并将这些功能范围应用为搜索的一部分。
这在 运行ning 应用程序中一切正常。
然而,在测试中,成功似乎取决于加载顺序。有时 Thing
具有预期的范围,有时则没有。我以为我可以通过在任何测试 运行 之前调用 Feature.count
来强制首先加载 Feature
class 和固定装置,但这不起作用。
有没有办法强制加载 class/fixtures 来解决这个问题?
为了确保在 classes 之前加载固定装置,有几个方向可供探索。
一个是检测 fixtures 何时完成加载并强制重新加载 Thing
class 以生成正确的范围。问题是我找不到检测灯具加载事件的方法。一个切线的问题是,在 config.cache_classes = true
存在的情况下,个人 class 重新加载会非常 hacky。
this answer 中描述了另一种更有前途的方法,它包括将测试运行器任务放入包装器中,以确保首先加载固定装置。
我有一个 ActiveRecord class,它的作用域是根据另一个 table.
的内容动态添加的(简化代码示例)
class Thing < ActiveRecord::Base
Feature.all.each do |feature|
scope feature.name, ->{joins(:feature).where("feature.name = #{feature.name})}
end
end
应用程序 UI 的另一部分是 "Thing display",可让您搜索并将这些功能范围应用为搜索的一部分。
这在 运行ning 应用程序中一切正常。
然而,在测试中,成功似乎取决于加载顺序。有时 Thing
具有预期的范围,有时则没有。我以为我可以通过在任何测试 运行 之前调用 Feature.count
来强制首先加载 Feature
class 和固定装置,但这不起作用。
有没有办法强制加载 class/fixtures 来解决这个问题?
为了确保在 classes 之前加载固定装置,有几个方向可供探索。
一个是检测 fixtures 何时完成加载并强制重新加载 Thing
class 以生成正确的范围。问题是我找不到检测灯具加载事件的方法。一个切线的问题是,在 config.cache_classes = true
存在的情况下,个人 class 重新加载会非常 hacky。
this answer 中描述了另一种更有前途的方法,它包括将测试运行器任务放入包装器中,以确保首先加载固定装置。