使用 shared_exapmles_for 时守卫找不到更新的示例

guard can't find updated examples when using shared_exapmles_for

为了整理代码,我将 concerns 方法的 RSpec 测试分开到 spec/concerns 目录。

我关注了this answer。 (从答案中复制粘贴)

# app/models/concerns/personable.rb

module Personable
  extend ActiveSupport::Concern

  def full_name
    "#{first_name} #{last_name}"
  end
end

# spec/concerns/personable_spec.rb

require 'spec_helper'

shared_examples_for "personable" do
  let(:model) { described_class } # the class that includes the concern

  it "has a full name" do
    person = FactoryGirl.create(model.to_s.underscore.to_sym, first_name: "Stewart", last_name: "Home")
    expect(person.full_name).to eq("Stewart Home")
  end
end

# spec/models/master_spec.rb

require 'spec_helper'

describe Master do
  it_behaves_like "personable"
end

# spec/models/apprentice_spec.rb

require 'spec_helper'

describe Apprentice do
  it_behaves_like "personable"
end

当我编辑 personable_spec.rb 守卫检测更新时,但由于文件中没有示例,它最终变成了 No examples found

我必须 运行 所有规格来测试 personable_spec.rb。有没有办法自动测试 shared_examples_for 方法中定义的示例?

这是你必须做的:

1- 不要使用后缀 _spec 命名您的共享示例文件,它们不是规范文件,它们是支持文件。我还建议将它们分组到一个名为 support 的子文件夹中,以便更好地组织文件。

因此,将您的文件 spec/concerns/personable_spec.rb 移动到 spec/support/concerns/personable.rb,甚至 spec/support/shared_examples/concerns/personable.rb,或者任何您认为合适的文件。

2- 从支持文件中删除行 require 'spec_helper',此 require 语句仅在规范文件中需要,在支持文件中不需要

3- 告诉 rspec 通过在 spec_helper.rb 文件末尾添加以下内容来加载 support 下的所有文件:

# Load custom matchers and macros, etc
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

4- 重启 guard 并 运行 你的测试。

5- 你还需要告诉守卫在 support 文件夹和子文件夹下的所有文件中寻找变化,所以你不会有为每次更改重新启动守卫