ActiveRecord灯具的文档说:
除了在数据库中可用之外,还可以使用与模型具有相同名称的特殊动态方法来访问夹具的数据,并接受要实例化的夹具的名称: / p>
并给出了这个例子。
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结果保留在文件的其他位置。
答案 0 :(得分:2)
正如您所写,答案是使用def setup_fixture_accessors(fixture_set_names = nil)
方法的fixtures.rb。
您可以看到已创建一个新模块。使用模块中的define_method
添加了夹具访问器。这样,accessor_name
就可以在模块中使用和调用了。
最后,include methods
包括上面定义的模块methods
的所有方法。现在,这些访问器在调用def fixtures(*fixture_set_names)
(通常为ActiveSupport::TestCase
)的命名空间中可用