运行test子模块作为主挂钩

时间:2016-04-06 18:09:58

标签: racket require

鉴于此代码:

#lang racket/base

(module+ test
  (require rackunit rackunit/text-ui)

  (provide suite)

  (define suite
    (test-suite
     "test tests"

     (test-equal? "test string test"
                  "string"
                  "string")))

  (run-tests suite))

;(require 'test)
;(suite)

如果留下最后两行,并且文件以raco test test.rkt运行,则会输出

raco test: (submod "test.rkt" test)
1 success(es) 0 failure(s) 0 error(s) 1 test(s) run
0
1 test passed

预期。

如果文件只是作为脚本运行而不是raco运行,我如何让文件运行?

我认为最后两条注释行会做我想要的:导入子模块然后调用函数,

(require 'test)
(suite)

但我得到了:

$ racket test.rkt
require: unknown module
  module name: #<resolved-module-path:'test>
  context...:
   standard-module-name-resolver

Learn Racket in Y Minutes似乎说'test作为'symbol用于子模块,但可能不是。

1 个答案:

答案 0 :(得分:2)

使用module+module*声明的子模块在其包含模块中不可用于require,因为它们可以依赖于它们的包含模块,并且模块依赖关系图中的循环不是&n #39;允许。 (相反,使用module声明的子模块不能依赖于它们的包含模块,但它们的包含模块可以require它们。)

尝试添加main子模块;应该在文件作为脚本运行时运行:

(module+ main
  (require (submod ".." test))
  (run-tests suite))
BTW,Racket约定是test子模块运行测试,而不仅仅是定义它们。添加main子模块可能会使raco test停止为您的脚本工作;修复方法是将(run-tests suite)调用转移到test子模块。