1

How to Design Programs第二版中的练习 42解释说 DrRacket 突出显示了cond下面代码中的最后两个子句,因为测试用例并未涵盖所有可能的用例。

; TrafficLight -> TrafficLight
; given state s, determine the next state of the traffic light

(check-expect (traffic-light-next "red") "green")

(define (traffic-light-next s)
  (cond
    [(string=? "red" s) "green"]
    [(string=? "green" s) "yellow"]
    [(string=? "yellow" s) "red"]))

我的理解是else最后的一个子句应该涵盖其余的情况,所以我尝试替换最后的表达式:

(define (traffic-light-next s)
  (cond
    [(string=? "red" s) "green"]
    [(string=? "green" s) "yellow"]
    [(string=? "yellow" s) "red"]
    [else "green"]))

这并不能解决突出显示的问题。这里发生了什么?

4

1 回答 1

5

我认为您可能误解了突出显示的目的。代码覆盖工具的重点是确保您有足够的测试用例(即check-expects)来覆盖您编写的所有代码,而不是确保您的cond子句覆盖数据定义的所有情况。在您的代码段中,您check-expect只是在测试"red"案例。check-expect您可以通过为数据定义的其他两种情况编写 s 来消除突出显示。

另请注意,您实际上不想在else此处编写案例,因为您的 a 数据定义TrafficLight仅包含三个案例。else在不违反您的签名/合同的情况下,您无法测试您的案例。

于 2012-09-03T13:56:00.090 回答