« Back to Index

Test “Duck Typing” using RSpec 3’s instance_double

View original Gist on GitHub

duck typing rspec.rb

class Calculator
  def reduce(operator)
    fail "You shouldn't be calling this directly!"
  end
end

def uses_a_duck_type(calculation)
  calculation.reduce(:+)
end

RSpec.describe "various ways to use instance_double with duck typing" do

  context "defining a local module to document the duck type" do
    duck_type = Module.new do
      def reduce(operator)
        fail "You shouldn't be calling this directly!"
      end
    end

    it "works as expected with duck types" do
      stubbed_calculator = instance_double(duck_type, reduce: 2)
      expect(uses_a_duck_type(stubbed_calculator)).to eq 2
    end
  end

  context "using the assumed Calculator class" do
    it "works with we intended" do
      stubbed_calculator = instance_double("Calculator", reduce: 5)
      expect(uses_a_duck_type(stubbed_calculator)).to eq 5
    end
  end

  context "using a common object which quacks properly" do
    it "works with an Array as well" do
      stubbed_calculator = instance_double("Array", reduce: :ohmy)
      expect(uses_a_duck_type(stubbed_calculator)).to eq :ohmy
    end
  end

end