printer = ->(msg) { puts "#{msg}" } logger = ->(msg) { File.open("test.txt", "a") {|f| f.write(msg) } } class Person def initialize(first_name, last_name) @first_name, @last_name = first_name, last_name end def display_name(printer) name = "#{@first_name} #{@last_name}" printer.call(name) name end end require 'minitest/autorun' require 'mocha/setup' require 'stringio' module Kernel def capture_stdout out = StringIO.new $stdout = out yield return out ensure $stdout = STDOUT end end describe Person do subject { Person.new("James", "OKelly") } describe "#display_name" do subject { Person.new("James", "OKelly"). display_name(printer) } describe "when the printer is a putser" do let(:hof) { printer } it "must use the putser to print the name" do stdout = capture_stdout do subject end stdout.string.must_equal "James OKelly\n" end end describe "when the printer is a logger" do let(:hof) { logger } it "must use the logger to print the name" do subject File.read("test.txt").must_equal "James OKelly" end end end end