I just stumbled across the Self-Shunt unit testing pattern[0] and
decided, in my nuby quest to learn more about Ruby, to implement it in
Ruby. It’s simple enough thanks to duck-typing. Almost ridiculously so,
in fact.
My question, though, is: does the way I implemented this go against an
established ruby idiom or violate “the ruby way” in any way? If so I’d
love to hear it.
Thanks!
-dave
===== self_shunt.rb
require ‘test/unit’
Implements self-shunt pattern in Ruby.
Self-shunt detailed at:
http://www.objectmentor.com/resources/articles/SelfShunPtrn.pdf
class Display
def display_item(item)
puts “The REAL display is showing: #item”
# God only knows what other processing might take place here …
end
end
class Scanner
accepts any object having a #display_item(item) method
hooray duck typing
def initialize(display)
@display = display
end
def scan(item)
@display.display_item(item)
end
end
completely pointless class to demonstrate the idea
class Item
def initialize(name)
@name = name
end
def to_s
@name
end
end
first test the self-shunt
class ScannerTest < Test::Unit::TestCase
def test_scan
scanner = Scanner.new(self)
item = Item.new(“test item”)
scanner.scan(item)
assert_equal(“test item”, @displayed_item.to_s)
end
def display_item(item)
@displayed_item = item
end
end
now do the real thing
def main # habits die hard…
display = Display.new
scanner = Scanner.new(display)
scanner.scan Item.new(“now we are displaying the REAL item”)
2.times {puts} # to pad between this output and the test output
end
main