RSpec - 在规范助手中使用 `let`

use*_*003 1 rspec ruby-on-rails

我有一个大型模型,在 RSpec 测试中需要时间来初始化。

我希望它可以用于每个示例,但只想在示例需要时才加载它。

这似乎是let()延迟加载的完美用途——仅在需要时加载它。

在任何特定的规范文件中我可以做

require "spec_helper"

feature "foo" do
  let(:big_class) { MyBigClass.new(bar) }

  ...
end
Run Code Online (Sandbox Code Playgroud)

这将使big_class该规范文件中的每个示例都可用。

有没有一种方法可以使其更加全球化,以便每个规范文件和示例都可以使用它?我找不到let在规范助手内部初始化的好方法。

ska*_*lee 5

您可以简单地定义一个共享上下文并将其包含在每个示例中。关于您的特定问题,它应该如下所示:

RSpec.shared_context "Global helpers" do
  let(:big_class) { MyBigClass.new(bar) }
end

RSpec.configure do |config|
  config.include_context "Global helpers"
end
Run Code Online (Sandbox Code Playgroud)

然而,在所有示例中包含共享上下文并不是一个好主意,并且big_class您问题中的帮助器确实看起来像是特定于领域的东西。您可以通过元数据来控制共享上下文包含,例如,当您只想在功能规范中包含给定的共享上下文时(:type => :feature默认情况下它们都设置了元数据),您可以这样做:

RSpec.configure do |config|
  config.include_context "Feature spec helpers", :type => :feature
end
Run Code Online (Sandbox Code Playgroud)