Często podczas pisania testów/specyfikacji mamy ochotę na przetestowanie danej metody prywatnej. Wiele osób testuje tylko publiczny interfejs klasy ale zdarzają się przypadki kiedy chciałoby się przetestować kilka wybranych prywatnych metod (np. kiedy publiczny interfejs jest bardzo prosty a prawdziwa praca wykonywana jest przez prywatne metody - co często z drugiej strony jest oznaką niezrównoważonego projektu klasy).
Z pomocą przychodzi Ruby ze swoimi mechanizmami refleksji i dynamicznych otwartych klas:
[code=ruby]require ‘rubygems’
require ‘dust’
require ‘test/unit’
class Ninja
private
def kill(num_victims)
“#{num_victims} victims are no longer with us.”
end
end
class Class
def publicize_methods
saved_private_instance_methods = self.private_instance_methods
self.class_eval { public *saved_private_instance_methods }
yield
self.class_eval { private *saved_private_instance_methods }
end
end
unit_tests do
test “kill returns a murder string” do
Ninja.publicize_methods do
assert_equal ‘3 victims are no longer with us.’, Ninja.new.kill(3)
end
end
end[/code]
Znalezione tutaj