我正在尝试对我在球拍中编写的代码进行单元测试,并且我不想单独提供每个函数,因此我将其全部编写在一个模块中:
(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?
但这对我毫无帮助。
Racket中的每个源文件隐含的是一个模块;
module
形式创建 子模块,这可以通过 submod
: 来实现
(require (submod "avl_tree.rkt" avl_tree))
您还需要在 (all-defined-out)
形式中使用
provide
;请注意括号。
在您的示例中,您想删除
module
并保留其主体:
#lang racket/base
(provide (all-defined-out))
(define (is-tree? tree)
; does whatever)
; so on with other code
)
(另请注意使用 惯用的 kebab-case;
is-tree?
而不是 is_tree?
。遵守约定,其他人会更乐意阅读您的代码。)
test
子模块将测试添加到与正在测试的代码相同的文件中,而不会降低效率,该子模块由DrRacket的Run命令(ctrl+r)自动运行或通过 raco test
命令行工具。这里的关键是使用 module+
创建子模块:
#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))