删除C#中单元测试中使用的临时DLL

本文关键字:DLL 单元测试 删除 | 更新日期: 2023-09-27 18:27:00

我有一个函数addFromXML(),它加载一个XML文件,解析它的DLL路径,并加载这些DLL。这些DLL是我在其他项目中编写的基于CLR的程序集(而不是本机代码)

为了测试它,我有多个单元测试函数,在准备过程中,使用Path.getTempPath()将示例XML文件和存根DLL文件从参考资料中复制到一个临时文件中,然后运行测试。

通常,我可以在finally块中完成测试后删除文件。然而,DLL是有问题的,因为一旦加载到当前AppDomain中,就无法删除它们,所以我必须在每次测试运行完成后手动删除DLL。如果我不这样做,每次单元测试时,我的临时文件夹的大小可能会越来越大,这就是我试图减少的。如果我的开发团队中的其他人运行单元测试,他们也会面临同样的问题,而我不希望这样。

释放DLL的唯一方法是将其加载到单独的AppDomain中。但是,我不想对我的程序这样做,因为它使事情过于复杂,可能会影响性能。卸载DLL的能力也不是实际程序本身的要求。

也许我将DLL复制到临时文件的方法是错误的?有没有更好的方法来测试涉及DLL的加载程序函数?

删除C#中单元测试中使用的临时DLL

您所写的并不是严格意义上的单元测试。理想的单元测试应该是健壮的,因此不应该触及文件系统。

如果您对最大限度地提高单元测试覆盖率感兴趣,一个好的方法可能是包装文件副本.NET调用,并测试它是否被正确的DLL路径调用。这将允许您在不创建脆弱的单元测试的情况下对正在调用的拷贝进行资产配置,而您团队的其他成员都必须了解并设置这些单元测试。

您还可以通过在单元测试项目中包含一个示例DLL并在单元测试期间加载它来测试加载的DLL。这不需要在文件系统上移动东西,也不受您的限制。

目标是让单元测试只测试代码,而不是.NET框架、硬盘或网络。你的团队和那些追随你的人会为此感谢你。我希望这会有所帮助。

您可以在测试运行之前删除以前的dll,即在测试运行前而不是之后进行清理。这样,以前的dll就不会加载到应用程序域中,并且可以安全地删除它们。你仍然会有1分的dll,但这应该不是什么大不了的事。