当class被单元测试实例化时,实例化的class中的图像会触发System.IO异常
When class is instantiated by Unit Test, System.IO exception is triggered for image in instantiated class
我有一个 windows 表单应用程序,它可以正常工作(编译会在 bin\debug 中创建 .exe 以及一个名为 'Images' 的文件夹。这个 'Images' 文件夹是在我的项目解决方案文件夹中并设置为 "always copy"。
编译代码时,一切正常,没有 System.IO 异常。
但是,如果引用图像的 class 是在没有编译的情况下通过单元测试工具实例化的,我会看到以下内容:
System.Drawing.Image.FromFile(字符串文件名,布尔值 useEmbeddedColorManagement)
在 System.Drawing.Image.FromFile(字符串文件名)
在 YahtzeeApplication.GameBoard..ctor() 在 E:\workspaces\visual studio projects\Yahtzee\YahtzeeApplication\YahtzeeApplication\GameBoard.cs:line 124
在 UnitTestProject.GameBoardTest.GameBoardElements() 在 E:\workspaces\visual studio projects\Yahtzee\YahtzeeApplication\UnitTestProject\GameBoardTest.cs:line 37
结果消息:System.IO.FileNotFoundException:Images.dice.GIF
这是加载图像的代码:
diceImageArray[0] = Image.FromFile("Images\1.dice.GIF");
我正在查看测试 class 或实例化 class 是否没有看到图像。但是当我将一个名为 'Images' 的文件夹放在相对于 call 的任一位置时,错误并没有消失。
你在单元测试中对这个场景做了什么?
相对路径不正确,因为你无法控制当前目录,这是相对路径的基础。同样的代码也会失败,如果你只是 运行 一个控制台应用程序而不先切换到包含图像目录的目录,例如...
foo\bar\myprogram.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中只有"compiled",所以我会留下任何错误让你修复。 :-)
上述代码的例外情况是您的代码正在被影子复制。然后您需要访问它来自的原始位置,而不是当前位置。如果碰巧是这种情况,它需要更多的代码,我不想让这个例子过于复杂。
如果加载图像的程序集始终相对于自身定位图像,那么只要您确保图像存在于该位置,您的测试就应该能够正常工作。
我有一个 windows 表单应用程序,它可以正常工作(编译会在 bin\debug 中创建 .exe 以及一个名为 'Images' 的文件夹。这个 'Images' 文件夹是在我的项目解决方案文件夹中并设置为 "always copy"。
编译代码时,一切正常,没有 System.IO 异常。
但是,如果引用图像的 class 是在没有编译的情况下通过单元测试工具实例化的,我会看到以下内容:
System.Drawing.Image.FromFile(字符串文件名,布尔值 useEmbeddedColorManagement) 在 System.Drawing.Image.FromFile(字符串文件名) 在 YahtzeeApplication.GameBoard..ctor() 在 E:\workspaces\visual studio projects\Yahtzee\YahtzeeApplication\YahtzeeApplication\GameBoard.cs:line 124 在 UnitTestProject.GameBoardTest.GameBoardElements() 在 E:\workspaces\visual studio projects\Yahtzee\YahtzeeApplication\UnitTestProject\GameBoardTest.cs:line 37 结果消息:System.IO.FileNotFoundException:Images.dice.GIF
这是加载图像的代码:
diceImageArray[0] = Image.FromFile("Images\1.dice.GIF");
我正在查看测试 class 或实例化 class 是否没有看到图像。但是当我将一个名为 'Images' 的文件夹放在相对于 call 的任一位置时,错误并没有消失。
你在单元测试中对这个场景做了什么?
相对路径不正确,因为你无法控制当前目录,这是相对路径的基础。同样的代码也会失败,如果你只是 运行 一个控制台应用程序而不先切换到包含图像目录的目录,例如...
foo\bar\myprogram.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中只有"compiled",所以我会留下任何错误让你修复。 :-)
上述代码的例外情况是您的代码正在被影子复制。然后您需要访问它来自的原始位置,而不是当前位置。如果碰巧是这种情况,它需要更多的代码,我不想让这个例子过于复杂。
如果加载图像的程序集始终相对于自身定位图像,那么只要您确保图像存在于该位置,您的测试就应该能够正常工作。