スコープ
すべての rspec-mocks の構造物は、各例ごとにライフサイクルを持ちます。メッセージの期待値は、各例の後で検証されます。ダブル、メソッドスタブ、スタブ化された定数などは、各例の後にすべてクリーンアップされます。これにより、各例を独立して実行し、任意の順序で実行できるようになります。
before(:example)
フック内でダブル、スタブ、メッセージの期待値を設定することは完全に問題ありません。なぜなら、このフックは例のスコープで実行されるからです。
before(:example) do
allow(MyClass).to receive(:foo)
end
before(:context)
は個々の例のスコープ外で実行されるため、rspec-mocks の機能の使用はサポートされていません。ただし、RSpec::Mocks.with_temporary_scope { }
を使用して、before(:context)
フックを含む任意のコンテキストで一時的なスコープを作成することはできます。
before(:context)
フック内でダブルを作成できません
次の内容で "before_context_spec.rb" という名前のファイルがあるとします。
RSpec.describe "Creating a double in a before(:context) hook" do
before(:context) do
@dbl = double(:foo => 13)
end
it "fails before it gets to the examples" do
expect(@dbl.foo).to eq(13)
end
end
rspec before_context_spec.rb
を実行すると、
次のエラーが発生するはずです。
rspec-mocks のダブルや部分的なダブルをテストライフサイクルの外で使用することはサポートされていません。