我目前正在将单元测试放在正在处理的文件的底部,如下所示:
(provide foo)
(define (bar x) (+ 1 x))
;; unit tests
(module+ test
(require racket/pretty)
(define testcases '(2 3 4))
(for ([test testcases])
(pretty-print (bar test))))
这可行,但是我想避免对所有模块重复样板单元测试代码。之前从未在Racket中编写宏,所以我不确定如何将各个部分组合在一起。
我想将以下代码扩展到上述样板版本:
(provide foo)
(define (bar x) (+ 1 x))
;; unit tests
(test foo '(2 3 4))
答案 0 :(得分:4)
对于test
宏,您确定需要从宏中生成require
吗?如果在定义test
的文件中需要pretty-print
,则可以使racket/pretty
宏生成test
的使用,然后在其中是否有需求都没关系使用test
的文件。
例如,如果您有两个文件macro.rkt
和use.rkt
:
文件macro.rkt
:
#lang racket
(provide test)
(require racket/pretty
syntax/parse/define)
(define-simple-macro (test fn:id args:expr)
(module+ test
(define testcases args)
(for ([test testcases])
(pretty-print (fn test)))))
文件use.rkt
:
#lang racket
(require "macro.rkt")
(provide foo)
(define (foo x) (+ 1 x))
;; unit tests
(test foo '(2 3 4))
然后,对pretty-print
的引用即使在use.rkt
中通常不可用,也可以在宏的输出中使用。之所以有效,是因为pretty-print
是从宏定义站点(而不是使用站点)获取范围的。
这对您的问题有用吗?