使用对象

时间:2016-11-06 17:04:23

标签: unit-testing testing lisp racket

我正在尝试用Racket和Dr. Racket建立经典游戏“Snake”。

我喜欢使用单元测试来判断我是否理解了代码背后的概念。

我开始为Snake和2维(2D)平面中的位置创建结构定义:

(struct snake (dir segs)) 

(struct posn (x y))

之后,我创建了一个蛇示例:

(define snake-example
  (snake "up" (list (posn 1 1) (posn 1 2) (posn 1 3))))

如果我尝试访问我的蛇对象上的segs,我会打电话:

(snake-segs snake-example)

>> '(#<posn> #<posn> #<posn>)

与调用相同:

(list (posn 1 1) (posn 1 2) (posn 1 3))

>> '(#<posn> #<posn> #<posn>)

但是,如果我尝试使用测试和rackunit进行检查,则不起作用:

(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)))

为什么会这样?

1 个答案:

答案 0 :(得分: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