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

问题描述 投票:0回答:1

我正在尝试对我在球拍中编写的代码进行单元测试,并且我不想单独提供每个函数,因此我将其全部编写在一个模块中:

(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?
但这对我毫无帮助。

module racket
1个回答
0
投票

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))
© www.soinside.com 2019 - 2024. All rights reserved.