第二版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"]))
这不能解决突出显示问题。这是怎么回事?
答案 0 :(得分:5)
我认为你可能会误解突出的目的。代码覆盖率工具的要点是确保您有足够的测试用例(即check-expect
s)来覆盖您编写的所有代码,而不是确保您的{{1}子句涵盖了数据定义的所有情况。在您的代码段中,cond
仅测试check-expect
案例。您可以通过为数据定义的其他两种情况编写"red"
来消除突出显示。
另请注意,您实际上不希望在此处编写check-expect
案例,因为else
的数据定义仅包含三种情况。在不违反签名/合同的情况下,您无法测试TrafficLight
案例。