如何在测试期间加载/删除clojure中的命名空间

时间:2015-06-12 16:12:09

标签: clojure namespaces

我正在开发一个在应用程序启动期间在源代码树中找到依赖关系的库,并且我正在尝试编写集成测试以确保它正常工作。我的测试命名空间中有夹具文件,测试开始并成功就好了。

为了确保测试不会影响未来的运行,我添加了一个""""使用remove-ns删除测试夹具名称空间的处理程序(在midje中)。

在下次加载时,测试失败,因为缺少名称空间。

似乎remove-ns不仅删除了命名空间,而且还无法使用require将其加载到同一个正在运行的VM中。我注意到,谨慎使用"谨慎使用"关于remove-ns的说明没有任何解释。

我已经确认手动运行require实际上似乎无法重新加载已删除的命名空间:

 user=>(test.util.fixtures.A/f)
 {:item 1}
 user=> (remove-ns 'test.util.fixtures.A)
 #<Namespace test.util.fixtures.A>
 user=> (test.util.fixtures.A/f)
 ClassNotFoundException test.util.fixtures.A  
 user=> (require 'test.util.fixtures.A)
 nil
 user=> (test.util.fixtures.A/f)
 ClassNotFoundException test.util.fixtures.A  

任何人都明白为什么会这样?

1 个答案:

答案 0 :(得分:3)

我通过源跟踪,最终需要调用load-libs,后者又调用load-lib,后者又检查全局原子(行是loaded (contains? @*loaded-libs* lib))。

进一步阅读,似乎一旦加载了某些内容,您就可以为库加载器指定:reload选项。现在我记得看到了:reload,所以解决办法是将:reload放在要求中:

 user=> (require 'test.util.fixtures.A :reload)
 nil
 user=> (test.util.fixtures.A/f)
 {:item 1}