5

メソッド内のメソッドの動作をスタブ化しようとしています:

class A
  def method_one(an_argument)
  begin
    external_obj = ExternalThing.new
    result = external_obj.ext_method(an_argument)
  rescue Exception => e
    logger.info(e.message)
  end
  end
end

仕様:

it "should raise an Exception when passed a bad argument" do
  a = A.new
  external_mock = mock('external_obj')
  external_mock.stub(:ext_method).and_raise(Exception)
  expect { a.method_one("bad") }.to raise_exception
end

ただし、例外が発生することはありません。

私も試しました:

it "should raise an Exception when passed a bad argument" do
  a = A.new
  a.stub(:ext_method).and_raise(Exception)
  expect { a.method_one("bad") }.to raise_exception
end

それもうまくいきません。この場合、どのようにして外部メソッドを適切にスタブして例外を強制することができますか?

アイデアをよろしくお願いします!

4

1 に答える 1

4

newのクラスメソッドをスタブしてExternalThing、モックを返すようにする必要があります。

it "should raise an Exception when passed a bad argument" do
  a = A.new
  external_obj = mock('external_obj')
  ExternalThing.stub(:new) { external_obj }
  external_obj.should_receive(:ext_method).and_raise(Exception)
  expect { a.method_one("bad") }.to raise_exception
end

このソリューションはrspec3で非推奨になっていることに注意してください。rspec3で非推奨になっていないソリューションについては、rspec3-クラスメソッドのスタブを参照してください。

于 2012-08-27T21:45:16.007 に答える