あるメソッドが、その中で他のクラスのインスタンスを生成してそのインスタンスメソッドが呼ばれることを確認したい。しかし、実際にそのメソッドを動かすとすごく時間がかかったりとか色々面倒なので呼ばれたことだけをテストしたい。
def exec_service(user)
Service.new(user).start #このコードが呼ばれることをテストしたいが、実際に動作するのは困る
end
そこでメソッドをモックしたインスタンスを作成し、そのクラスのnewが必ずそのインスタンスを返すようにした。
example "exec_serviceを呼ぶとService.new(user).startが呼ばれる" do
# 実際にstartが呼ばれないようにモックする
@servise = Service::.new("user") # モックのServiceインスタンスを作成
allow(@Service).to receive(:start) # モックのインスタンスのstartメソッドをモックして本来のメソッドが呼ばれないようにする
allow(Service).to receive(:new).and_return(@servise) # Service.new がモックのインスタンスを返すようにする
# 呼び出す
exec_service("user")
# Service#startが呼ばれたことを確認
expect(@servise).to have_received(:start).once
end
end