【问题标题】:How do I use modules in `spec/support/` for Ruby on Rails RSpec tests如何使用 `spec/support/` 中的模块进行 Ruby on Rails RSpec 测试
【发布时间】:2021-01-20 20:32:18
【问题描述】:

我想为典型的 Ruby on Rails 项目正确使用 spec/support/ rspec 目录中的 module 文件。

# spec/support/page_objects/foo/bar.rb

module Foo
  module Bar  
    def hello
      "hello world"
    end
  end
end

# spec/support/page_objects/foo/foo_bar.rb

class FooBar
  include Foo::Bar
end

# spec/system/foo_bars/create_spec.rb

RSpec.describe "Create FooBar", type: :system do
  it "returns hello world"
    expect(FooBar.new.hello).to eq "hello world"
  end
end

我希望 rspec spec/foo_bars/create_spec.rb 通过,但我收到了 uninitialized constant Foo::Bar

我可以让它工作的唯一方法是在类文件中要求模块。

# spec/support/page_objects/foo/foo_bar.rb

require_relative("bar")

class FooBar
  include Foo::Bar
end

有没有办法正确使用spec/support 中的module 文件来避免必须显式调用require

【问题讨论】:

  • rails_helper.rb 中有一个注释掉的部分(至少由 gem 生成),它遍历 spec/support 目录及其子目录并需要所有文件。它在 RSpec.configure 部分之上。

标签: ruby-on-rails ruby rspec


【解决方案1】:

默认情况下,spec 中的任何内容都不会自动加载。

通常会在 spec/rails_helper.rb 中添加一行来加载规范/支持文件

Dir[Rails.root.join('spec/support/**/*.rb')].sort.each { |f| require f }

请注意,这将增加所有测试运行的加载时间,无论它们是否使用您的支持文件。这对于一般用途的支持文件来说很好,但对于特定于单个类的支持文件来说不是一个好主意。那些测试类会污染每一个测试。

相反,请考虑将它们写为shared context 并根据需要包括在内。将它们放在 shared_context 目录中。您还可以加载所有共享的上下文和示例。

Dir[Rails.root.join('spec/**/shared*/*.rb')].sort.each { |f| require f }

请注意,spec/support/page_objects/foo/foo_bar.rb 通常用于 Foo::FooBar。 FooBar 应该进入 spec/support/page_objects/foo_bar.rb。这不会对您的代码产生实质性影响,但最好按照 Rails 标准命名。

【讨论】:

  • 欣赏建议! spec/support/ 会不会是 page_objects/ 不合适的家?我现在认为是的,因为 PageObject 类是特定于规范的,但是根据 rails_helper.rb 行,无论使用如何,都会为每个规范加载。
  • @ChrisLaBarge 这取决于。我在规范/支持中有一些小型共享测试类。最重要的是注意不要污染命名空间。将它们放入 Fake:: 或 ForTesting:: 之类的内容中。我还将在共享上下文中将无名类编写为let(:some_class_obj) { Class.new do ... end },并使用let(:some_class) { stub_const('SomeClass', some_class_obj) } 为它们命名(如果需要)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多