我正在开发一个在应用程序启动期间在源代码树中找到依赖关系的库,并且我正在尝试编写集成测试以确保它正常工作。我的测试命名空间中有夹具文件,测试开始并成功就好了。
为了确保测试不会影响未来的运行,我添加了一个""""使用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
任何人都明白为什么会这样?
答案 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}