Bil*_*eal 5 c# msbuild mstest csproj
我有一个测试项目,它运行一个程序 (a .exe) 并确保结果按预期出现。
我想声明测试项目依赖于构建 的项目,.exe并将.exedrop 放入$(OutDir)(或$(OutputPath))的子目录中。
$(OutDir)MyTests.dll (测试项目)$(OutDir)\Product\Foo.exe (测试项目)$(OutDir)\Product\xxx.dll (测试项目的依赖项)这样我就可以写一个表单的测试:
[TestClass]
[DeploymentItem("Product", "Product")]
public class RunFoo
{
[TestMethod]
public void HelpTextMatches()
{
// System.Diagnostics.Process.Start("Product\foo.exe" ...)
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法<ProjectReference在我的测试.csproj文件中声明类似 a 的东西,这将允许我实现这一目标?
(我不想让<Copy任务获取被测程序的输出,因为这样就没有什么可以强制 MSBuild 在测试项目之前构建被测程序了。)
我想声明测试项目取决于构建 .exe 的项目......
在项目参考 ( source )上设置ReferenceOutputAssembly为:false
<ProjectReference Include="..\ProjectA\ProjectA.csproj">
<Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project>
<Name>ProjectA</Name>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)
...并将 .exe 放到 $(OutDir)(或 $(OutputPath))的子目录中
构建后操作。或者就地运行测试中的 exe。
我不太明白您不使用 的原因ProjectReference,但这本质上与添加的作用相同ProjectReference,只是没有添加程序集引用。
<ItemGroup>
<ExtraDependencies include="ExeProject.csproj" />
</ItemGroup>
<Target Name="GetExtraDependenciesTargets">
<MSBuild Projects="@(ExtraDependencies)" Targets="GetTargetPath">
<Output TaskParameter="TargetOutputs" ItemName="ResolvedDependencyTargets" />
</MSBuild>
</Target>
<Target Name="BuildExtraDependencies"
BeforeTargets="BeforeBuild"
DependsOnTargets="GetExtraDependenciesTargets"
Inputs="@(ExtraDependencies)"
Outputs="@(ResolvedDependencyTargets)">
<MSBuild Projects="@(ExtraDependencies)" Targets="Build">
<Output TaskParameter="TargetOutputs" ItemName="BuiltDependencyTargets" />
</MSBuild>
</Target>
Run Code Online (Sandbox Code Playgroud)
或者,您可以保留ProjectReference但只是在ResolveProjectReferences目标之后劫持构建过程,并将 exe 作为依赖项删除(从_ResolvedProjectReferencePaths)。