如何使数据文件可用于单元测试?

hau*_*ous 3 mstest visual-studio

我正在使用 VS2008 TFS(使用 MSTest)。

我有一个可靠的单元测试,它依赖于项目子文件夹中的数据文件(即 testproject1\TestData)。数据文件属性为 Build Action=Content,Copy Always。(它不是这样的测试数据文件,而是生产代码读取并通常在其自己的文件夹中期望的文件)

当测试构建并执行时,数据文件被正确复制到...\TestResults\(testruniD)\Out 文件夹中,测试代码找到它。

现在,我将测试及其数据文件移动到解决方案中的另一个测试项目(它真正应该在的位置),数据文件位于与新测试项目 (testproject2\TestData) 和数据文件属性相同的文件夹中被检查为仍然如上。但是,在重新构建时,测试在新位置失败,因为数据文件尚未复制到测试结果输出文件夹,因此执行代码无法找到它。

我应该做些什么来确保仍然复制数据文件?

我之前遇到过一个相关的问题,一些数据文件被复制到测试结果输出文件夹,而有些则没有,没有明显的原因,这让我感到困惑。

TIA

Sau*_*001 5

我知道这已经晚了。接受的答案在技术上是正确的。但是,多年来我发现当您有太多数据文件时,DeploymentAttribute方法变得很麻烦。在我的情况下,它接近千。问题是

  1. 请记住将每个文件标记为Copy to output。
  2. 每次我调试项目时,一千个数据文件都会被复制到MyUnitTestProject\Bin\Debug。这减慢了我的整体开发和调试体验。

建议的解决方案

我提出的解决方案是让数据文件在单元测试项目中保留为静态文件,并使用执行System.Reflection.Assembly的Location属性简单地确定绝对路径。考虑到我正在处理的大量数据文件,这对我来说非常有效。当测试在Jenkins构建服务器上运行时运行良好。

您可以参考我在另一个答案中发布的代码片段。 NUnit 部署项

我提出的解决方案的缺点

您不会在每次测试运行时都创建一个新的部署文件夹。如果您的单元测试要创建输出文件,那么您负责在单元测试程序集的位置下生成一个新文件夹,通常是MyUnitTestProject\Bin\Debug。

在这里发布代码是因为我的超链接答案已被删除 有人名叫 Martijn Pieters 删除了我的原始答案,因为他不喜欢重复。因此,我在这里复制原始代码。

    internal static string GetFullPathToFile(string pathRelativeUnitTestingFile)
{
    string folderProjectLevel = GetPathToCurrentUnitTestProject();
    string final = System.IO.Path.Combine(folderProjectLevel, pathRelativeUnitTestingFile);
    return final;
}
/// <summary>
/// Get the path to the current unit testing project.
/// </summary>
/// <returns></returns>
private static string GetPathToCurrentUnitTestProject()
{
    string pathAssembly = System.Reflection.Assembly.GetExecutingAssembly().Location;
    string folderAssembly = System.IO.Path.GetDirectoryName(pathAssembly);
    if (folderAssembly.EndsWith("\\") == false) folderAssembly = folderAssembly + "\\";
    string folderProjectLevel = System.IO.Path.GetFullPath(folderAssembly + "..\\..\\");
    return folderProjectLevel;
}
Run Code Online (Sandbox Code Playgroud)