我正在尝试使用 Racket 和 Dr. Racket 构建经典游戏“Snake”。
我喜欢使用单元测试来查看我是否理解代码背后的概念。
我开始为 Snake 和二维 (2D) 平面中的位置创建结构定义:
(struct snake (dir segs))
(struct posn (x y))
之后,我创建了一个蛇的例子:
(define snake-example
(snake "up" (list (posn 1 1) (posn 1 2) (posn 1 3))))
如果我尝试访问我的 snake 对象上的段,我会调用:
(snake-segs snake-example)
>> '(#<posn> #<posn> #<posn>)
这与调用相同:
(list (posn 1 1) (posn 1 2) (posn 1 3))
>> '(#<posn> #<posn> #<posn>)
但是,如果我尝试使用测试和机架单元来检查它,它不起作用:
(require rackunit)
(check-equal? (snake-segs snake-example) (list (posn 1 1) (posn 1 2) (posn 1 3)))
我得到这个答案:
FAILURE
actual: (#<posn> #<posn> #<posn>)
expected: (#<posn> #<posn> #<posn>)
name: check-equal?
location: (#<path:/home/pedro/Desktop/realm-of-racket/cap-6.rkt> 276 0 8425 81)
expression: (check-equal? (snake-segs snake-example) (list (posn 1 1) (posn 1 2) (posn 1 3)))
为什么会这样?
最佳答案
简短的回答是 Racket 结构在默认情况下是不透明的,不透明结构上的相等性不会查看成员。参见 Structure Comparisons了解更多详细信息,以及如何修复它。
为了快速修复,你让你的 posn 结构透明:
(struct posn (x y) #:transparent)
问题不仅限于 check-equal?
。 equal?
也显示了这种行为,如果我们使用上面的示例:
(equal?
(snake-segs snake-example)
(list (posn 1 1) (posn 1 2) (posn 1 3))) ; false
关于使用对象在 Racket 中进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40452043/