2017-08-22 63 views
7

我正在用ruby,rspec,水豚和硒测试一个web应用程序,我遇到了一个uninitialized constant ActiveAdminLoginPage异常,我不知道该如何解决。从Ruby中的文件名动态创建自动加载命令

在spec_helper.rb我正在要求如下:

Dir[File.join(Dir.pwd, 'spec/page_objects/**/*.rb')].each { |f| require f } 

我有2个班

spec/page_objects/products/active_admin_login_page.rb 

module Products 
    class ActiveAdminLoginPage < ::ActiveAdminLoginPage 
    ... 
    end 
end 

继承

spec/page_objects/active_admin_login_page.rb 

遗憾的是子类的父之前加载类。

如何从目录中的所有文件名动态创建autoload命令? 我想换掉这个命令:

Dir[File.join(Dir.pwd, 'spec/page_objects/**/*.rb')].each { |f| require f }

与自动加载命令。

+1

你从自动加载期待什么行为?它会自动基于缺少的常量加载文件?你很可能需要编写一个“包装器”,因为这个功能不是内置的。问题是你如何期望它的行为。典型地,你通过'require(_relative)'加载每个文件的所有依赖关系。要自动完成这项工作,您需要使用相对严格的命名约定来计算要加载的文件。 – insider

回答

4

如何使用require在需要它的文件中加载依赖项?

require只加载一次文件,所以你不应该遇到任何副作用。

,或者甚至更好,你可以使用auto_load,它使用require引擎盖下,但它确实是一个更聪明的方式

autoload :ActiveAdminLoginPage, 'active_admin_login_page' 
+0

我知道这会工作,但我更喜欢自动加载文件,而不是添加需要手动。如果我没有找到自动加载的解决方案,那么我会采用这种方法,但在我想尝试获取文件自动加载之前。 –

+0

你知道如何从'active_admin_login_page'创建符号:ActiveAdminLoginPage吗?由于即时通讯从page_object目录中读取所有文件,我需要动态地执行此操作。 –

+0

你不需要做任何特别的事情。退房http://lifeonubuntu.com/use-rubys-autoload-instead-of-require-for-your-ruby-and-rails-apps/ –