0

現在 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ため、もちろんメソッドはデフォルトに戻ります。

4

1 に答える 1

0

RSpec 3 のテスト double のスタブは、次のように作成されallowます。

foo = double("foo")
allow(foo).to receive(:baz) { "baz" }

ただし、テスト double を作成するときにハッシュを指定することで、許可されるメソッドを定義することもできます。

foo = double("foo", baz: "baz")
于 2014-09-22T19:38:34.840 に答える