現在 RSpec 3 を使用しているプロジェクトがありますが、メソッドをスタブ化するための RSpec 2 構文がまだ含まれています (現在は廃止されています)。
現在、以下を広く使用しています。
Class::OtherClass.any_instance.stub(:method)
これらは、ActiveRecord モデルに含まれるシミュレーション モジュールから呼び出されます (これはすぐに重要です)。
シミュレーションのメソッドは、アプリケーションが仕様を実際に実行するか、モック モードで実行するかに基づいて、仕様内から呼び出されます。
したがって、シミュレーション モジュールは次のようになります。
module Foo::Simulation
def break_baz!
Foo::Bar.any_instance.stub(:baz).and_raise(ArgumentError.new("You broke your baz!"))
end
end
これを double を使用するように変換しようとしていますが、double に相当する構文がわかりません。
の動作を複製する方法で、誰かがダブルスで私を助けることができますany_instance.stub
か?
編集1
これまでに最も近いのは次のとおりです。
module Foo::Simulation
def break_baz!
allow(self.baz).to receive(ArgumentError.new("You broke your baz!"))
end
end
しかし、コントローラーに投稿するときにオブジェクト ID が変更されると、メソッドはスタブされなくなります。
編集2
これは私が提供できる限りのコードです:
class Provider
include Provider::Simulation
def iam
Fog::AWS::IAM.new(credentials)
end
end
次に、シミュレーション:
module Provider::Simulation
def break_server_certificates!
Fog::Mock.any_instance.stub(:upload_server_certificate).and_raise(new_error)
end
end
仕様:
it "should not upload a server certificate" do
provider.break_server_certificates! # provider is defined and is an instance of the Provider AR model
client.post provider_server_certificates_path, params #client is a rack client that we use to test api interactions
end
さて、問題はany_instance.stub
、シミュレーションで double、特に部分的な doubleを使用するように変更するときです。これは、次のようなもので、取得できた中で最も近いものです。
def break_server_certificates!
expect(self.iam).to receive(:upload_server_certificates).and_raise(new_error)
end
メソッドは固執しますが、私のテストでは実際の API インタラクションが実行され、コントローラーでプロバイダーが再び検出されるため、同じインスタンスではないProvider
ため、もちろんメソッドはデフォルトに戻ります。