使用对象在 Racket 中进行单元测试

标签 unit-testing testing lisp racket

我正在尝试使用 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/

相关文章:

java - 当测试方法开始之前文件不存在时,为什么 getResourceAsStream() 返回 null?

Java 8 单元测试 CompletableFuture 异常

java - 使用 JUnit 测试 Swing 应用程序

javascript - 记录网站加载时间?

LISP 检查列表是否对称而没有反向

lisp - lisp在线教程

c# - 为单元测试哈希表数据类型生成随机值

reactjs - 测试悬念时不支持错误

lisp - lisp 中嵌套数据列表中的 'cdadr'

javascript - 如何模拟带有参数的 Angular 服务方法