我正在计划一个包含多个模块的项目,我正在寻找一个很好的解决方案来同时运行项目中的所有现有单元测试。我提出了以下想法:我可以运行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
模板的文件名。在编译时是否有任何反射机制来获取源文件名?
答案 0 :(得分:5)
系统模块中的模板currentSourcePath使用内置的特殊编译器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类似的技术,通过应用switch in nim.cfg自动导入所有其他模块:
答案 1 :(得分:4)
instantiationInfo似乎就是你想要的:http://nim-lang.org/docs/system.html#instantiationInfo,
template filename: string = instantiationInfo().filename
echo filename()