before
とafter
フック
before
とafter
フックを使用して、例の本体が実行される前と/または後に任意のコードを実行します。
(((346f5183361f0fd8)))
before
とafter
ブロックは以下の順序で呼び出されます。
(((5cb5a53e0e371332)))
単独のbefore
またはafter
フックは、デフォルトで:example
スコープになります。
before
とafter
フックは、実行する例のグループ内に直接定義するか、グローバルなRSpec.configure
ブロックに定義することができます。ただし、例のステータスはフックに影響しません。
警告: before(:suite)
ではインスタンス変数の設定はサポートされていません。
警告: モックはbefore(:example)
でのみサポートされています。
警告: around
フックは、定義されたコンテキストに関係なく、before
フックの前とafter
フックの後に実行されます。
注意: :example
および:context
スコープは、それぞれ:each
および:all
としても利用できます。お好みのものを使用してください。
before(:example)
ブロックの定義
次の内容で「before_example_spec.rb」という名前のファイルがあるとします。
require "rspec/expectations"
class Thing
def widgets
@widgets ||= []
end
end
RSpec.describe Thing do
before(:example) do
@thing = Thing.new
end
describe "initialized in before(:example)" do
it "has 0 widgets" do
expect(@thing.widgets.count).to eq(0)
end
it "can accept new widgets" do
@thing.widgets << Object.new
end
it "does not share state across examples" do
expect(@thing.widgets.count).to eq(0)
end
end
end
「rspec before_example_spec.rb」と実行すると、
すべての例がパスするはずです。
例グループ内でbefore(:context)
ブロックを定義
次の内容で「before_context_spec.rb」という名前のファイルがあるとします。
require "rspec/expectations"
class Thing
def widgets
@widgets ||= []
end
end
RSpec.describe Thing do
before(:context) do
@thing = Thing.new
end
describe "initialized in before(:context)" do
it "has 0 widgets" do
expect(@thing.widgets.count).to eq(0)
end
it "can accept new widgets" do
@thing.widgets << Object.new
end
it "shares state across examples" do
expect(@thing.widgets.count).to eq(1)
end
end
end
「rspec before_context_spec.rb」と実行すると、
すべての例がパスするはずです。
「rspec before_context_spec.rb:15」と実行すると、
すべての例がパスするはずです。
before(:context)
ブロックでの失敗
次の内容で「before_context_spec.rb」という名前のファイルがあるとします。
RSpec.describe "an error in before(:context)" do
before(:context) do
raise "oops"
end
it "fails this example" do
end
it "fails this example, too" do
end
after(:context) do
puts "after context ran"
end
describe "nested group" do
it "fails this third example" do
end
it "fails this fourth example" do
end
describe "yet another level deep" do
it "fails this last example" do
end
end
end
end
「rspec before_context_spec.rb --format documentation」と実行すると、
出力に「5 examples, 5 failures」という文言が含まれるはずです。
また、出力には以下の内容が含まれるはずです。
an error in before(:context)
fails this example (FAILED - 1)
fails this example, too (FAILED - 2)
nested group
fails this third example (FAILED - 3)
fails this fourth example (FAILED - 4)
yet another level deep
fails this last example (FAILED - 5)
after context ran
「rspec before_context_spec.rb:9 --format documentation」と実行すると、
出力に「1 example, 1 failure」という文言が含まれるはずです。
また、出力には以下の内容が含まれるはずです。
an error in before(:context)
fails this example, too (FAILED - 1)
after(:context)
ブロックでの失敗
以下の内容で "after_context_spec.rb" という名前のファイルがあるとします:
RSpec.describe "an error in after(:context)" do
after(:context) do
raise StandardError.new("Boom!")
end
it "passes this example" do
end
it "passes this example, too" do
end
end
rspec after_context_spec.rb
を実行すると、
次のように失敗するはずです:
An error occurred in an `after(:context)` hook.
Failure/Error: raise StandardError.new("Boom!")
StandardError:
Boom!
# ./after_context_spec.rb:3