Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nim lang 如何为在Nim中编译失败的代码编写单元测试?_Nim Lang - Fatal编程技术网

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
编写。