Ruby TDD编码实践:布尔值处理与测试用例调试
嘿,这个问题我太熟悉了,刚好你已经摸到了正确的解决方向,咱们把整个逻辑理清楚,确保所有测试都能顺利通过:
问题核心
你遇到的卡点是hyperactive?方法不能固定返回false,它需要根据孩子摄入的糖量动态判断状态:初始糖量为0时不亢奋,当糖量达到或超过60克时切换为亢奋状态。
完整实现代码
TDD测试用例(保持你写的即可)
gem 'minitest', '~> 5.2' require 'minitest/autorun' require 'minitest/pride' require_relative 'kid' class KidTest < Minitest::Test def test_kid_has_not_eaten_sugar kid = Kid.new assert_equal 0, kid.grams_of_sugar_eaten end def test_kid_gets_5_grams_from_eating_candy kid = Kid.new kid.eat_candy assert_equal 5, kid.grams_of_sugar_eaten 5.times { kid.eat_candy } assert_equal 30, kid.grams_of_sugar_eaten end def test_kid_is_not_hyperactive kid = Kid.new refute kid.hyperactive? end def test_kid_is_hyperactive_after_60_grams_of_sugar kid = Kid.new 11.times { kid.eat_candy } refute kid.hyperactive?, "Not hyperactive yet..." kid.eat_candy assert kid.hyperactive?, "OK, now the kid is hyperactive." end end
优化后的Kid类业务代码
class Kid attr_reader :grams_of_sugar_eaten def initialize @grams_of_sugar_eaten = 0 end def eat_candy(grams = 5) @grams_of_sugar_eaten += grams end def hyperactive? @grams_of_sugar_eaten >= 60 end end
关键逻辑拆解
- 初始状态保障:在
initialize方法中把@grams_of_sugar_eaten初始化为0,既满足第一个测试用例的断言,也让hyperactive?在初始时自然返回false(因为0 < 60),完美通过第三个测试。 - 吃糖逻辑:
eat_candy方法支持默认每次加5克糖,也可以传入自定义糖量,累加的逻辑轻松覆盖多次吃糖的场景,完全符合第二个测试用例的要求。 - 亢奋状态动态判断:
hyperactive?方法的核心就是一行条件判断:- 当糖量不足60克时(比如11次吃糖后是55克),返回
false,通过最后一个测试的第一个断言; - 当第12次吃糖后糖量达到60克时,返回
true,顺利通过最后一个测试的第二个断言。
- 当糖量不足60克时(比如11次吃糖后是55克),返回
这样所有测试用例就能全部通过了,这个实现完全贴合TDD的思路——先写好测试用例定义需求,再补全满足需求的业务逻辑。
内容的提问来源于stack exchange,提问作者cjl85
相关产品推荐
相关产品推荐

