D
Dave Cantrell
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
[0] http://www.objectmentor.com/resources/articles/SelfShunPtrn.pdf
===== 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
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
[0] http://www.objectmentor.com/resources/articles/SelfShunPtrn.pdf
===== 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