Nim lang 如何为在Nim中编译失败的代码编写单元测试?
我在Nim lang 如何为在Nim中编译失败的代码编写单元测试?,nim-lang,Nim Lang,我在unittest模块的帮助下编写了大部分单元测试,但我不确定如何将其用于编译器在编译时应该拒绝的代码。例如,如果我想编写以下代码,并确保编译器在编译过程中始终出错(类型和模板将在单独的模块中),那么如何为此编写测试用例 import macros type T[n:static[int]] = object template foo3(n: int): expr = static: if n > 3: error "n > 3" type T3 = T[n]
unittest
模块的帮助下编写了大部分单元测试,但我不确定如何将其用于编译器在编译时应该拒绝的代码。例如,如果我想编写以下代码,并确保编译器在编译过程中始终出错(类型和模板将在单独的模块中),那么如何为此编写测试用例
import macros
type
T[n:static[int]] = object
template foo3(n: int): expr =
static:
if n > 3: error "n > 3"
type T3 = T[n]
T3
var
bar: foo3(4)
您可以使用系统模块提供的
编译
magic执行类似的操作
以下是编译器测试套件中的一个示例:请注意,在文件顶部,我们使用
编译魔术将接受
和拒绝
定义为简单的静态断言,并在整个文件中使用它们来测试有效和无效的重载调用
就个人而言,我认为在编译时失败更好,但是您可以将编译的结果
分配给运行时值,或者在检查
语句中使用它。这样做的唯一好处是,故障将以unittest库的标准方式报告。中
我有一个用于编译和加载nim源模块的包装器。当然,您不想运行它,但该技术可能适合您:
sourceFN = "foo.nim"
... (write source) ...
libFN = "foo.dll"
let output = execProcess(
"nim c --verbosity:0 --app:lib $1" % sourceFN,
options = {poStdErrToStdOut, poUsePath, poEvalCommand})
if not fileExists(libFN):
echo "COULDN'T COMPILE"
只需添加一个如何将检查
与编译
相结合的示例:
template notCompiles*(e:非类型化):非类型化=
未编译(e)
#单元测试中的用法:
检查:
notCompiles:
不编译
notCompiles:
设x=1#将失败
我使用的是一个模板,因为将not
与块直接结合是不可能的,而且我不想使用括号。在第一次调用error
时,编译仍然会中止,即使在compiles
中也是如此。因此,没有办法自动化测试。我也找不到办法将编译的结果保存为运行时值,以便使用unittest
编写。