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" が含まれていないはずです。