如何在球拍中使用模块?

时间:2016-10-28 18:46:34

标签: file unit-testing module racket

我想将我的单元测试代码与其他代码分开。

我将测试代码放入一个文件中,将另一个代码放入同一目录中的另一个文件中:

实际的代码文件:

#lang racket
(provide
  ...procedure names...)
...procedures...

测试代码文件:

#lang racket
(require rackunit)
(require "...filename of the actual code file...")
...some additional procedures...
...test suite with multiple test cases in it...

然后我跑:

raco test test-code-filename

但是,这不起作用,在第一次调用过程的第一个测试用例时,它没有在测试代码文件中定义,它告诉我它是一个未绑定的标识符。

在此结构之前,我还尝试在文件中使用(module(module+组合,但出现了同样的问题。

不知怎的,我似乎没有正确理解模块阅读文档。如何实现代码的这种分割(将它分成两个文件)?

2 个答案:

答案 0 :(得分:2)

嗯...所有定义的都不是必需的。所以,例如,

foo.rkt:

#lang racket

(provide a)

(define (a x) (add1 x))

和bar.rkt:

#lang racket

(require rackunit
         "foo.rkt")

;; passing test
(check-equal? (a 9) 10)
;; failing test:
(check-equal? (a 4) 6)

......正在运行

raco test /tmp/bar.rkt

生成此输出:

--------------------
FAILURE
actual:     5
expected:   6
name:       check-equal?
location:   (#<path:/tmp/bar.rkt> 9 0 111 22)
expression: (check-equal? (a 4) 6)

Check failure
--------------------

...所以我不确定为什么你的原始例子不起作用。听起来像其他事情正在发生。

答案 1 :(得分:0)

我似乎找到了答案。而不是使用:

(provide
  a
  b
  c ...)

我需要使用:

(provide (all-defined-out))

所以还有一组额外的括号。总的来说,我得到了以下结构:

#lang racket
(provide (all-defined-out))
...procedures...

测试代码文件:

#lang racket
(require rackunit)
(require "...filename of the actual code file...")
...some additional procedures...
...test suite with multiple test cases in it...

然后:

raco test file-with-tests.rkt

作品。在失败的情况下,它仍然不会打印任何描述,但这是另一个问题。