7

次のように書きたいと思います。

it 'does not invoke any MyService' do
    MyService.should_not_receive(<any method>)
    tested_method
end

MyService のすべてのメソッドを明示的にリストしたくはありません。これは、MyService に新しいメソッドが追加された場合に、暗黙のうちに誤検知が発生する脆弱なテストにつながる可能性があるためです。

4

3 に答える 3

2

オブジェクト内に依存関係を注入するMyServiceと、メソッドが定義されていないモックに置き換えることができるため、メソッド呼び出しで例外が発生します。

例を示しましょう。

class Manager
  attr_reader :service

  def initialize(service = MyService)
    @service = service
  end

  def do_stuff
    service.do_stuff
  end

  def tested_method
    other_stuff
  end
end

テストは次のようになります。

context "#do_stuff" do
  let(:manager) { Manager.new }

  it 'invokes MyService by default' do
    MyService.should_receive(:do_stuff)
    manager.do_stuff
  end
end

context "#tested_method" do
  let(:service) { mock("FakeService") }
  let(:manager) { Manager.new(service) }

  it 'does not invoke any service' do
    expect { manager.tested_method }.not_to raise_error
  end
end
于 2013-06-25T07:01:21.163 に答える