You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,顺利通过最后一个测试的第二个断言。

这样所有测试用例就能全部通过了,这个实现完全贴合TDD的思路——先写好测试用例定义需求,再补全满足需求的业务逻辑。

内容的提问来源于stack exchange,提问作者cjl85

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:08:48