メインコンテンツまでスキップ

when_first_matching_example_defined フックの使用方法

RSpecを使用する大規模なプロジェクトでは、特定の種類のスペックがロードされた場合にのみ必要ないくつかの高価なセットアップロジックが一般的です。もしその種類のスペックがロードされていない場合、セットアップのコストを避けたいと考えるでしょう。

when_first_matching_example_defined フックを使用すると、一致するメタデータを持つ最初の例が定義されたときに条件付きでいくつかのロジックを実行することが簡単になります。これにより、必要なセットアップが必要な場合にのみ実行されるようにすることができます。

背景

以下の内容で "spec/spec_helper.rb" という名前のファイルがあるとします:

RSpec.configure do |config|
config.when_first_matching_example_defined(:db) do
require "support/db"
end
end

以下の内容で "spec/support/db.rb" という名前のファイルがあるとします:

RSpec.configure do |config|
config.before(:suite) do
puts "Bootstrapped the DB."
end

config.around(:example, :db) do |example|
puts "Starting a DB transaction."
example.run
puts "Rolling back a DB transaction."
end
end

以下の内容で ".rspec" という名前のファイルがあるとします:

--require spec_helper

以下の内容で "spec/unit_spec.rb" という名前のファイルがあるとします:

RSpec.describe "A unit spec" do
it "does not require a database" do
puts "in unit example"
end
end

以下の内容で "spec/integration_spec.rb" という名前のファイルがあるとします:

RSpec.describe "An integration spec", :db do
it "requires a database" do
puts "in integration example"
end
end

スイート全体を実行するとDBのセットアップがロードされます

rspec を実行すると

次のように合格するはずです:

Bootstrapped the DB.
Starting a DB transaction.
in integration example
Rolling back a DB transaction.
.in unit example
.

ユニットスペックのみを実行するとDBのセットアップはロードされません

rspec spec/unit_spec.rb を実行すると

すべての例が合格するはずです

かつ、出力に "DB" が含まれていないはずです。