当类由单元测试实例化时,实例化类中的映像会触发System.IO异常



我有一个windows窗体应用程序,它运行时没有错误(compilation在bin\debug中创建.exe以及一个名为"Images"的文件夹。这个"Images"文件夹在我的项目解决方案文件夹中,并设置为"始终复制"。

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

然而,如果引用图像的类在没有编译的情况下通过单元测试工具实例化,我会看到以下内容:

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

这是加载图像的代码:

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

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

在单元测试中,你对这个场景做了什么?

相对路径是不正确的,因为您无法控制当前目录,而当前目录是相对路径的基础。如果您只是运行控制台应用程序,而没有首先更改到包含映像目录的目录,同样的代码也会失败,例如。。。

foobarmyprogram.exe

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

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

更新-2019年1月22日

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

以下是一些代码,这些代码将相对于加载图像的程序集的位置来定位图像(请参见下面的异常(。。。

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中"编译"过,所以我会留下任何错误供您修复。:-(

上述代码的例外情况是,您的代码正在进行卷影复制。然后,您需要访问它的原始位置,而不是当前位置。如果碰巧是这样的话,它需要更多的代码,我不想让这个例子过于复杂。

如果加载图像的程序集总是相对于自身定位图像,那么只要确保图像存在于该位置,测试就应该工作。

相关内容

最新更新