Skip to content

Instantly share code, notes, and snippets.

@eitoball
Last active December 25, 2015 18:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eitoball/7021388 to your computer and use it in GitHub Desktop.
Save eitoball/7021388 to your computer and use it in GitHub Desktop.
CodeIQ×はてな エンジニア夏祭り2013 和田 卓人さんからのテスト駆動開発の問題(https://codeiq.jp/ace/wada_takuto/q469
class Greeter
def initialize(time_proc = -> { Time.now.strftime("%H:%M:%S") })
@time_proc = time_proc
end
def greet
time = @time_proc.call
if '05:00:00' <= time && time < '12:00:00'
'おはようございます'
elsif '12:00:00' <= time && time < '18:00:00'
'こんにちは'
else
'こんばんは'
end
end
end
require 'minitest/spec'
require 'minitest/autorun'
class MiniTest::Spec
def self.at(time_str, &block)
described_class = Class.const_get(describe_stack.last.name)
wrapped_with_stub_time_proc = ->(&spec_proc) do
self.class.singleton_class.class_eval do
define_method(:greeter) do
described_class.new(-> { "#{time_str}" })
end
end
yield
end
it("at #{time_str}", &wrapped_with_stub_time_proc)
end
end
class Object
def must_greet(greeting)
MiniTest::Spec.current.assert_equal(greeting, greet)
end
end
describe Greeter do
at('05:00:00') { greeter.must_greet 'おはようございます' }
at('11:59:59') { greeter.must_greet 'おはようございます' }
at('12:00:00') { greeter.must_greet 'こんにちは' }
at('17:59:59') { greeter.must_greet 'こんにちは' }
at('18:00:00') { greeter.must_greet 'こんばんは' }
at('23:59:59') { greeter.must_greet 'こんばんは' }
at('00:00:00') { greeter.must_greet 'こんばんは' }
at('04:59:59') { greeter.must_greet 'こんばんは' }
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment