如何在测试期间加载/删除clojure中的名称空间
我正在开发一个在应用程序启动期间在源代码树中查找依赖项的库,我正在尝试编写一个集成测试来确保它正常工作。我的测试名称空间中有fixture文件,测试开始并顺利完成 为了确保测试不会影响将来的运行,我添加了一个“after”处理程序(在midje中),它使用如何在测试期间加载/删除clojure中的名称空间,clojure,namespaces,Clojure,Namespaces,我正在开发一个在应用程序启动期间在源代码树中查找依赖项的库,我正在尝试编写一个集成测试来确保它正常工作。我的测试名称空间中有fixture文件,测试开始并顺利完成 为了确保测试不会影响将来的运行,我添加了一个“after”处理程序(在midje中),它使用remove ns删除测试夹具名称空间 在下一次加载时,测试失败,因为缺少名称空间 似乎remove ns不仅删除了名称空间,还使得以后无法使用require将其加载到同一个运行的VM中。我注意到remove ns上有一个“小心使用”的说明,没
remove ns
删除测试夹具名称空间
在下一次加载时,测试失败,因为缺少名称空间
似乎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
user=>(test.util.fixtures.A/f)
{:项目1}
user=>(删除ns的test.util.fixtures.A)
#
user=>(test.util.fixtures.A/f)
ClassNotFoundException test.util.fixtures.A
user=>(需要'test.util.fixtures.A]
无
user=>(test.util.fixtures.A/f)
ClassNotFoundException test.util.fixtures.A
有人知道为什么会发生这种情况吗?我通过源代码进行了跟踪,结果它需要调用load libs,然后调用load lib,然后检查全局原子(该行是
加载的(包含?@*加载的libs*lib)
)
进一步阅读,似乎一旦加载了某些内容,就可以为库加载器指定:reload
选项。现在我记得看到了:reload
,所以解决方案是将:reload
放入require:
user=> (require 'test.util.fixtures.A :reload)
nil
user=> (test.util.fixtures.A/f)
{:item 1}
我跟踪了源代码,结果它需要调用load libs,load lib又调用load lib,load lib又检查全局原子(该行是
加载的(包含@loaded libs*lib)
)
进一步阅读,似乎一旦加载了某些内容,就可以为库加载器指定:reload
选项。现在我记得看到了:reload
,所以解决方案是将:reload
放入require:
user=> (require 'test.util.fixtures.A :reload)
nil
user=> (test.util.fixtures.A/f)
{:item 1}
我跟踪了源代码,结果它需要调用load libs,load lib又调用load lib,load lib又检查全局原子(该行是
加载的(包含@loaded libs*lib)
)
进一步阅读,似乎一旦加载了某些内容,就可以为库加载器指定:reload
选项。现在我记得看到了:reload
,所以解决方案是将:reload
放入require:
user=> (require 'test.util.fixtures.A :reload)
nil
user=> (test.util.fixtures.A/f)
{:item 1}
我跟踪了源代码,结果它需要调用load libs,load lib又调用load lib,load lib又检查全局原子(该行是
加载的(包含@loaded libs*lib)
)
进一步阅读,似乎一旦加载了某些内容,就可以为库加载器指定:reload
选项。现在我记得看到了:reload
,所以解决方案是将:reload
放入require:
user=> (require 'test.util.fixtures.A :reload)
nil
user=> (test.util.fixtures.A/f)
{:item 1}