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

any_instance

any_instanceは、クラスの任意のインスタンスをスタブ化またはモック化する古い方法ですが、すべてのクラスに対してグローバルなモンキーパッチの負荷を持っています。 この機能の使用は一般的にはおすすめしません

背景

次の内容で「spec/spec_helper.rb」という名前のファイルがあるとします。

RSpec.configure do |config|
config.mock_with :rspec do |mocks|
mocks.syntax = :should
end
end

および、次の内容で「.rspec」という名前のファイルがあるとします。

--require spec_helper

クラスの任意のインスタンスのメソッドをスタブ化する

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします。

RSpec.describe "Stubbing a method with any_instance" do
it "returns the specified value on any instance of the class" do
Object.any_instance.stub(:foo).and_return(:return_value)

o = Object.new
expect(o.foo).to eq(:return_value)
end
end

「rspec spec/example_spec.rb」と実行すると、

すべての例がパスするはずです。

クラスの任意のインスタンスの複数のメソッドをスタブ化する

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします。

RSpec.describe "Stubbing multiple methods with any_instance" do
it "returns the specified values for the given messages" do
Object.any_instance.stub(:foo => 'foo', :bar => 'bar')

o = Object.new
expect(o.foo).to eq('foo')
expect(o.bar).to eq('bar')
end
end

「rspec spec/example_spec.rb」と実行すると、

すべての例がパスするはずです。

特定の引数を持つクラスの任意のインスタンスをスタブ化する

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします。

RSpec.describe "Stubbing any instance with arguments" do
it "returns the stubbed value when arguments match" do
Object.any_instance.stub(:foo).with(:param_one, :param_two).and_return(:result_one)
Object.any_instance.stub(:foo).with(:param_three, :param_four).and_return(:result_two)

o = Object.new
expect(o.foo(:param_one, :param_two)).to eq(:result_one)
expect(o.foo(:param_three, :param_four)).to eq(:result_two)
end
end

「rspec spec/example_spec.rb」と実行すると、

すべての例がパスするはずです。

ブロック実装は最初の引数としてレシーバーが渡されます

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします。

RSpec.describe "Stubbing any instance of a class" do
it 'yields the receiver to the block implementation' do
String.any_instance.stub(:slice) do |value, start, length|
value[start, length]
end

expect('string'.slice(2, 3)).to eq('rin')
end
end

「rspec spec/example_spec.rb」と実行すると、

すべての例がパスするはずです。

クラスの任意のインスタンスにメッセージが送信されることを期待する

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします。

RSpec.describe "Expecting a message on any instance of a class" do
before do
Object.any_instance.should_receive(:foo)
end

it "passes when an instance receives the message" do
Object.new.foo
end

it "fails when no instance receives the message" do
Object.new.to_s
end
end

「rspec spec/example_spec.rb」と実行すると、

次の出力で失敗するはずです。

| 2 examples, 1 failure | | 以下のメッセージを受け取るべきインスタンスがちょうど1つありませんでした: foo |