C# 生成测试:检查文件是否存在于其他项目中

C# 生成测试:检查文件是否存在于其他项目中,c#,unit-testing,build,path,msbuild,C#,Unit Testing,Build,Path,Msbuild,我在我的主项目中有一个位于~/bin/foo/FOO32.EXE的内容文件,它有时会从源代码管理中丢失(人们正在处理.gitignore);这每次都会破坏我们的身材 我决定做一个基本的测试项目,确保文件在需要的地方。作为构建的一部分,测试项目将在我们的竹服务器中运行 我想在我的测试项目中测试该文件是否存在,但路径可能会根据构建配置动态更改(我们构建了32位版本和任意CPU版本,这意味着bin目录可以更改一点) 作为单元测试的一部分,我如何验证该文件是否存在于我的构建项目中?我希望是这样的: [T

我在我的主项目中有一个位于~/bin/foo/FOO32.EXE的内容文件,它有时会从源代码管理中丢失(人们正在处理.gitignore);这每次都会破坏我们的身材

我决定做一个基本的测试项目,确保文件在需要的地方。作为构建的一部分,测试项目将在我们的竹服务器中运行

我想在我的测试项目中测试该文件是否存在,但路径可能会根据构建配置动态更改(我们构建了32位版本和任意CPU版本,这意味着bin目录可以更改一点)

作为单元测试的一部分,我如何验证该文件是否存在于我的构建项目中?我希望是这样的:

[TestMethod]
public void BbqExeExists()
{
    var basePath = ??? some expression that gets the main project's app directory
    var basefilePath = @"foo/FOO32.EXE";
    var fullPath = Path.Combine(basePath, basefilePath);

    Assert.IsTrue(File.Exists(fullPath));
}

正如评论中提到的:我想说的是,这样的测试并不真正属于单元测试项目的代码中。然而,在msbuild本身中实现它是相当容易的。在项目中放置一个这样的目标,该目标确定输出目录:

<Target Name="BbqExeExists" BeforeTargets="Build">
  <Error Condition="!Exists('$(TargetDir)/foo/FOO32.EXE')" Text="FRequired file missing"/>
</Target>


由于
BeforeTargets
属性,它将在构建的其余部分之前运行。此外,我还使用了
TargetDir
,这是构建的可执行文件通常所在的位置,尽管您的问题并不清楚它是否是您需要的文件。

您不能将文件包含到项目中并让构建操作:无,复制到输出:始终吗?在单元测试中测试文件是否存在通常是一件痛苦的事情,这还取决于您的测试运行人员…@AlexeiLevenkov问题是,我们的开发人员有时会从存储库中删除文件,因此它会被删除(构建过程的第一步是与repo同步)。如果文件不存在,将其设置为“复制到输出”总是没有帮助。我想向删除该文件的开发人员发送一个nastygram,因为他没有注意到,并确定构建无效。可能是预构建事件而不是单元测试@JeremyHolovacs,但由于缺少文件,构建应该失败。。。应该比测试失败更明显。。。