次のように書きたいと思います。
it 'does not invoke any MyService' do
MyService.should_not_receive(<any method>)
tested_method
end
MyService のすべてのメソッドを明示的にリストしたくはありません。これは、MyService に新しいメソッドが追加された場合に、暗黙のうちに誤検知が発生する脆弱なテストにつながる可能性があるためです。
次のように書きたいと思います。
it 'does not invoke any MyService' do
MyService.should_not_receive(<any method>)
tested_method
end
MyService のすべてのメソッドを明示的にリストしたくはありません。これは、MyService に新しいメソッドが追加された場合に、暗黙のうちに誤検知が発生する脆弱なテストにつながる可能性があるためです。
オブジェクト内に依存関係を注入する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