【问题标题】:Dynamically create autoload command from filenames in Ruby从 Ruby 中的文件名动态创建自动加载命令
【发布时间】:2018-01-30 19:49:37
【问题描述】:

我正在使用 ruby​​、rspec、capybara 和 selenium 测试一个 Web 应用程序,我遇到了 uninitialized constant ActiveAdminLoginPage 异常,我不知道如何解决。

在 spec_helper.rb 我需要以下内容:

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

我有两节课

spec/page_objects/products/active_admin_login_page.rb  

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

继承自

spec/page_objects/active_admin_login_page.rb

不幸的是,子类在父类之前加载。

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

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

使用自动加载命令。

【问题讨论】:

  • 您对自动加载有什么期望?它会根据丢失的常量自动加载文件吗?无论如何,您很可能需要编写一个“包装器”,因为此功能未内置。问题是您希望它如何表现。通常,您通过 require(_relative) 为每个文件加载所有依赖项。要自动完成这项工作,您需要相对严格的命名约定来计算要加载的文件。

标签: ruby selenium rspec automated-tests autoload


【解决方案1】:

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

require 只加载一次文件,因此您不会遇到任何副作用。

或者,更好的是,您可以使用auto_load,它在后台使用require,但它以更智能的方式使用

autoload :ActiveAdminLoginPage, 'active_admin_login_page'

【讨论】:

  • 我知道这会起作用,但我更喜欢自动加载文件而不是手动添加需求。如果我没有找到自动加载的解决方案,那么我会采用这种方法,但在我想尝试自动加载文件之前。
  • 你知道如何从 'active_admin_login_page' 创建符号 :ActiveAdminLoginPage 吗?由于我从 page_object 目录中读取所有文件,因此我需要动态执行此操作。
  • 您不需要做任何特别的事情。查看lifeonubuntu.com/…
  • 我不想自动加载一个文件,而是一个完整的文件夹和子文件夹。我想用自动加载命令替换这一行Dir[File.join(Dir.pwd, 'spec/page_objects/**/*.rb')].each { |f| require f }
  • 如果不让 Ruby 知道哪个文件依赖于哪个文件,我认为这是不可能的。
猜你喜欢
  • 2020-10-05
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多