代码之家  ›  专栏  ›  技术社区  ›  GIZNAJ

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

  •  0
  • GIZNAJ  · 技术社区  · 6 年前

    我有一个Windows窗体应用程序正在正常工作(compilation在bin\debug中创建.exe以及一个名为“images”的文件夹)。此“图像”文件夹位于“我的项目解决方案”文件夹中,并设置为“始终复制”。

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

    但是,如果引用映像的类是在不编译的情况下通过单元测试工具实例化的,我会看到以下内容:

    system.drawing.image.fromfile(字符串文件名,布尔型useEmbeddedColorManagement) 位于system.drawing.image.fromfile(字符串文件名) 位于e:\workspaces\Visual Studio Projects\yahtzee\yahtzeeapplication\yahtzeeapplication\gameboard.cs:line 124中的yahtzeeapplication.gameboard..ctor()。 在e:\workspaces\Visual Studio项目\yahtzee\yahtzeeapplication\unittestproject\gameboardtest.cs:line 37中的unittestproject.gameboardtest.gameboardletments()。 结果消息:system.io.filenotfoundexception:images\1.dice.gif

    下面是加载图像的代码:

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

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

    在单元测试中,您如何处理这个场景?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Charlie    6 年前

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

    foo\bar\myprogram.exe
    

    通常,程序的用户可以控制当前目录。对于一个程序来说,更改当前目录或依赖于将其设置到任何特定位置是一种糟糕的形式…类似于正在运行的程序集的位置。

    另一种定位映像目录的方法取决于路径是在测试中确定的还是在测试中的应用程序中确定的。如果在测试中,那么努尼特已经 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中“编译”的,所以我会留下任何错误供您修复。-)

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

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