Skip to content

Instantly share code, notes, and snippets.

@odlp
Last active June 12, 2018 10:27
Show Gist options
  • Save odlp/81c08f7b1e645d4313424e54f131ea98 to your computer and use it in GitHub Desktop.
Save odlp/81c08f7b1e645d4313424e54f131ea98 to your computer and use it in GitHub Desktop.
Enforce a duck-typing interface with shared examples
require "rspec/autorun"
## A puddle of ducks
class AuthenticDuck
def squeeze
"quack"
end
end
class GeezerDuck
def squeeze
"OI! I'M QUACKING HERE"
end
end
class BrokenDuck
# Oops no squeeze
end
### Shared examples can describe & enforce a consistent interface
RSpec.shared_examples "quacks like a duck" do
it "can be squeezed" do
expect(subject).to respond_to :squeeze
expect(subject.squeeze).to match(/quack/i)
end
end
RSpec.describe AuthenticDuck do
include_examples "quacks like a duck"
end
RSpec.describe GeezerDuck do
include_examples "quacks like a duck"
end
RSpec.describe BrokenDuck do
include_examples "quacks like a duck"
end
Randomized with seed 63125
.F.
Failures:
1) BrokenDuck can be squeezed
Failure/Error: expect(subject).to respond_to :squeeze
expected #<BrokenDuck:0x007fe6072c6d08> to respond to :squeeze
Shared Example Group: "quacks like a duck" called from example.rb:35
# example.rb:21:in `block (2 levels) in <main>'
Finished in 0.01598 seconds (files took 0.12824 seconds to load)
3 examples, 1 failure
Failed examples:
rspec 'example.rb[3:1]' # BrokenDuck can be squeezed
Randomized with seed 63125
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment