ActiveRecord灯具的文档说:
除了在数据库中可用之外,还可以使用特殊的动态方法访问fixture的数据,该方法与模型具有相同的名称,并接受要实例化的fixture的名称:
并给出了这个例子。
test "find" do
assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
end
Ruby on Rails究竟是如何将“web_sites”插入命名空间的?我正在阅读lib / active_record / fixtures.rb中的文档和源代码,我无法弄明白。
我问因为(也许有另一种方法可以做到这一点),我正在开发一个具有很多固定装置且速度很慢的应用程序,我想在一个测试套件之前动态加载灯具,所以我们不要每次加载它们。
现在我最好的解决方案是做这样的事情:
result = ActiveRecord::FixtureSet.create_fixtures("test/largefixtures", "web_sites")
rails_site = result[0].all_loaded_fixtures["web_sites"]["rubyonrails"].find
这似乎相当脆弱,更不用说我不确定如何将create_fixtures结果保留在文件中其他位置的范围内。
正如你所写,答案是在fixtures.rb中使用def setup_fixture_accessors(fixture_set_names = nil)
方法。
您可以看到创建了一个新模块。使用模块中的define_method
添加夹具访问器。这样,accessor_name
就可以在模块中使用和调用。
最后,include methods
包括上面定义的模块methods
的所有方法。这些访问器现在在命名空间中可用,调用def fixtures(*fixture_set_names)
(通常是ActiveSupport::TestCase
)