通过单元测试实例化类时,实例化类中的图像会触发System.IO异常

时间:2018-12-16 00:24:01

标签: c# visual-studio unit-testing nunit

我有一个Windows窗体应用程序,可以正常运行(编译在bin \ debug中创建.exe以及一个名为“ Images”的文件夹。此“ Images”文件夹位于我的项目解决方案文件夹中,并设置为“始终复制” “

在编译代码时,一切都很好,并且没有System.IO异常。

但是,如果引用图像的类是在不进行编译的情况下实例化的,并且是通过单元测试工具进行的,那么我将看到以下内容:

System.Drawing.Image.FromFile(字符串文件名,布尔值useEmbeddedColorManagement)    在System.Drawing.Image.FromFile(String文件名)    在YahtzeeApplication.GameBoard..ctor()在E:\ workspaces \ visual studio projects \ Yahtzee \ YahtzeeApplication \ YahtzeeApplication \ GameBoard.cs:line 124中    在E:\ workspaces \ visual studio projects \ Yahtzee \ YahtzeeApplication \ UnitTestProject \ GameBoardTest.cs:line 37中的UnitTestProject.GameBoardTest.GameBoardElements()中 结果消息:System.IO.FileNotFoundException:Images \ 1.dice.GIF

以下是加载图片的代码:

diceImageArray[0] = Image.FromFile("Images\\1.dice.GIF");

我正在查看测试类或实例化类是否未看到图像。但是当我在相对于调用的任一位置放置一个名为“ Images”的文件夹时,错误并没有消失。

在单元测试中,您如何处理这种情况?

1 个答案:

答案 0 :(得分:1)

相对路径不正确,因为您无法控制当前目录,这是相对路径所基于的目录。如果只运行控制台应用程序而没有先进入包含图像目录的目录,例如,...

,则相同的代码也会失败。
foo\bar\myprogram.exe

通常,程序的用户可以控制当前目录。对于程序来说,更改当前目录或依赖于将其设置为任何特定位置都是不正确的形式,例如正在运行的程序集的位置。

查找映像目录的替代方法取决于是在测试中还是在测试中的应用程序中确定路径。如果正在测试中,则NUnit具有TestContext.TestDirectory,这是包含测试程序集的目录的路径。如果位于应用程序本身中,则需要对应用程序进行编码,以找到相对于某个特定位置的images目录,例如包含主程序的目录。如果您指出此代码的位置,那么我可以给出更准确的建议。

更新-2019年1月22日

在应用程序中使用相对路径是应用程序的弱点,除非在运行程序时您对当前目录设置拥有完全控制,否则在某些情况下它将导致应用程序失败。在NUnit下运行测试就是这样一种情况。 IMO,您应该更改应用程序,以使其在包含exe的目录相对于当前目录的路径中找到图像,而在相对于当前目录的 not 中找到图像。这会花费更多的代码,但会更好,因为这实际上是您打算发生的事情。您的测试指出了这个问题,对您有帮助!

这里有一些代码可以相对于执行图像加载的程序集的位置来定位图像(请参见下面的异常)。

string assemblyPath = GetType().Assembly.Location;
string assemblyDir = Path.GetDirectory(assemblyPath);
string imagePath = path.Combine(assemblyDir, "Images\\1.dice.GIF");
diceImageArray[0] = Image.FromFile(imagePath);

我将代码分布在多行上,因此您可以更轻松地查看每个步骤。您当然可以合并其中的一些。该代码仅在SO中被“编译”,因此我将保留所有错误供您修复。 :-)

以上代码的例外是如果您的代码正在被影印。然后,您需要访问它来自的原始位置,而不是当前位置。如果确实是这种情况,则需要更多代码,而我不想让示例过于复杂。

如果加载图像的程序集始终将它们相对于其自身定位,那么只要确保图像存在于该位置,您的测试就应该起作用。