对 racket 中另一个文件中的模块进行单元测试

Unit testing a module in another file in racket

提问人:Spartacuz9er9er 提问时间:11/13/2023 更新时间:11/13/2023 访问量:25

问:

我正在尝试对我用 racket 编写的代码进行单元测试,我不想单独提供每个函数,所以我将其全部编写在一个模块中:

(module avl_tree racket 
    (provide all-defined-out)
    (define (is_tree? tree)
        ; does whatever)

    ; so on with other code
)

这在文件 中。avl_tree.rkt

我正在尝试在同一目录的另一个文件中对其进行单元测试,avl_tree_testing,如下所示:

#lang racket
(require rackunit)
(require "avl_tree.rkt")

(is_tree? '(5 (1 null null) (9 (6 null null) (10 null null))))

但是,无论我做什么,我都会收到此错误:

<filepath>\avl_tree\avl_tree_testing.rkt:5:1: is_tree?: unbound identifier
  in: is_tree?Racket

我试过is_tree前缀吗?与模块的名称,但这让我无处可去。avl_tree:is_tree?

模块 球拍

评论


答:

2赞 Shawn 11/13/2023 #1

Racket 中的每个源文件都隐式地是一个模块;该表单创建子模块,这些子模块可以通过以下方式进行:modulesubmod

(require (submod "avl_tree.rkt" avl_tree))

您还需要在表单中使用 (all-defined-out);请注意 parens。provide

在您的示例中,您希望删除并保留其正文:module

#lang racket/base
;;; avl_tree.rkt

(provide (all-defined-out))

(define (is-tree? tree)
  ; does whatever)
  
  ; so on with other code
  )

有了这个,将按您的预期工作。(require "avl_tree.rkt")

(另请注意使用惯用的烤肉串盒; 不。坚持约定,其他人会更乐于阅读你的代码。平淡无奇可能会更好;问号表示零件。与标准函数(如 或)相比is-tree?is_tree?tree?is-string?number?)


此外,您可以使用测试子模块将测试添加到与正在测试的代码相同的文件中,而不会降低效率,该子模块由 DrRacket 的运行命令 (+) 或 raco 测试命令行工具自动运行。这里的关键是使用 module+ 创建子模块:ctrlr

#lang racket/base
;;; avl_tree.rkt

(provide (all-defined-out))
(module+ test (require rackunit))

(define (is-tree? tree)
  ; does whatever)
  
  ; so on with other code
  )

(module+ test
  (define some-tree '(5 (1 null null) (9 (6 null null) (10 null null))))
  (check-pred is-tree? some-tree))

评论

0赞 Shawn 11/13/2023
顺便说一句,您还可以一次提供多个标识符。.然后是. 在我的经验中,并没有那么多使用(provide a b c)contract-outall-defined-out