【问题标题】:How can I access a data file from a Unit test method?如何从单元测试方法访问数据文件?
【发布时间】:2015-01-23 13:39:55
【问题描述】:

这是我尝试访问文件的方式-

  1. 我在单元测试项目中添加了一个文件夹“TestData”

  2. 通过 Add->Existing Item 添加了一个文件。设置 Build Action=None, Copy To Output Directory= Copy Always

在单元测试方法中访问文件如下-

string fileName = System.IO.Path.Combine(
            System.IO.Path.GetDirectoryName(
            System.Reflection.Assembly.GetExecutingAssembly().Location), "TestData\\TestExcel2007File1.xlsx");

XmlDocument actual;
actual.Load(fileName);       //Throws exception saying cannot find part of the file path

我也尝试过使用 Method 属性——

[TestMethod, DeploymentItem(@"Test Data\", @"Test Data\")]

似乎都不起作用。

生成的文件路径是

"D:\\MyProject\\TestResults\\MACHINE_NAME 2015-01-23 05_21_45\\Out\\TestData\\TestExcel2007File1.xlsx"

并且 Out 文件夹没有 TestData 文件夹或 Excel 文件。

编辑:我引用的程序集存在于 Out 文件夹中。我正在使用 Visual Studio 2010。

我在 Visual Studio 2012 的另一个项目中执行了相同的步骤,并且似乎找到了文件并按预期工作。

EDIT 2:我发现TestData文件夹被复制到bin\debug文件夹中,而不是生成的路径中。但是引用的程序集是在生成的路径中复制的!

编辑 3:添加了一个 testsetting 文件并检查了 Enable Deployment Menu,在 Additional Files and directory to deploy 列表中添加了 TestData 文件夹,仍然没有工作。

【问题讨论】:

  • 请注意:单元测试不应触及任何外部资源(文件、数据库等)。如果您需要在单元测试中测试某些功能,则需要将它们模拟出来。

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


【解决方案1】:

我使用 xUnit 并这样做:

public static string GetImportPath()
{
    string[] importPaths =
    {
            @"TestData", @"..\TestData", @"..\..\TestData",
    };
    string importPath = importPaths.FirstOrDefault(Directory.Exists);
    Guard.NotNull(importPath, "importPath not found");
    return importPath;
}

我的项目文件夹中有TestData 文件夹,与binProperties 等级别相同。

在你的情况下,你会这样使用它:

string fileName = Path.Combine(GetImportPath(), "TestExcel2007File1.xlsx");

【讨论】:

  • 谢谢,但 Linq 或 Guard 类不适用于我的测试!
  • 嗯,你可以省略这个Guard,它只是一个安全检查,并不重要
【解决方案2】:

重新启动视觉工作室使其工作。甚至关闭并重新打开解决方案都不够!!!

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2013-07-04
    相关资源
    最近更新 更多