Nim 中的单元测试:是否可以在编译时获取源文件的名称?
Unit Testing in Nim: Is it possible to get the name of a source file at compile time?
我正在计划一个包含多个模块的项目,我一直在寻找一个很好的解决方案来一次性解决 运行 项目中所有现有的单元测试。我想出了以下想法:我可以 运行 nim --define:testing main.nim
并使用以下模板作为我所有单元测试的包装器。
# located in some general utils module:
template runUnitTests*(code: stmt): stmt =
when defined(testing):
echo "Running units test in ..."
code
到目前为止,这似乎运行良好。
作为一个小调整,我想知道我是否真的可以打印出调用 runUnitTests
模板的文件名。编译时有没有反射机制获取源文件名?
instantiationInfo 似乎是你想要的:http://nim-lang.org/docs/system.html#instantiationInfo,
template filename: string = instantiationInfo().filename
echo filename()
模板currentSourcePath来自系统模块returns当前源的路径通过使用内置的特殊编译器,称为instantiationInfo
。
在您的情况下,您需要打印模板调用者的位置,这意味着您必须直接使用 instantiationInfo 及其默认堆栈索引参数 -1(表示堆栈,或调用者):
# located in some general utils module:
template runUnitTests*(code: stmt): stmt =
when defined(testing):
echo "Running units test in ", instantiationInfo(-1).filename
code
值得一提的是,Nim 编译器本身使用了与 this module, which get automatically imported in all other modules by applying a switch in nim.cfg:
类似的技术
我正在计划一个包含多个模块的项目,我一直在寻找一个很好的解决方案来一次性解决 运行 项目中所有现有的单元测试。我想出了以下想法:我可以 运行 nim --define:testing main.nim
并使用以下模板作为我所有单元测试的包装器。
# located in some general utils module:
template runUnitTests*(code: stmt): stmt =
when defined(testing):
echo "Running units test in ..."
code
到目前为止,这似乎运行良好。
作为一个小调整,我想知道我是否真的可以打印出调用 runUnitTests
模板的文件名。编译时有没有反射机制获取源文件名?
instantiationInfo 似乎是你想要的:http://nim-lang.org/docs/system.html#instantiationInfo,
template filename: string = instantiationInfo().filename
echo filename()
模板currentSourcePath来自系统模块returns当前源的路径通过使用内置的特殊编译器,称为instantiationInfo
。
在您的情况下,您需要打印模板调用者的位置,这意味着您必须直接使用 instantiationInfo 及其默认堆栈索引参数 -1(表示堆栈,或调用者):
# located in some general utils module:
template runUnitTests*(code: stmt): stmt =
when defined(testing):
echo "Running units test in ", instantiationInfo(-1).filename
code
值得一提的是,Nim 编译器本身使用了与 this module, which get automatically imported in all other modules by applying a switch in nim.cfg:
类似的技术