我有一个运行程序(.exe
)的测试项目,并确保结果按预期结束。
我想宣布测试项目取决于构建.exe
的项目,并将.exe
drop放入$(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" ...)
}
}
有没有办法在我的测试<ProjectReference
文件中声明类似.csproj
的内容,这样我才能实现这一目标?
(我不想让<Copy
任务抓住被测程序的输出,因为在测试项目之前没有什么可以迫使MSBuild构建测试中的程序。)
答案 0 :(得分:2)
我想声明测试项目取决于构建.exe的项目......
在项目参考(source)上将ReferenceOutputAssembly
设置为false
:
<ProjectReference Include="..\ProjectA\ProjectA.csproj">
<Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project>
<Name>ProjectA</Name>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
...并将.exe drop放入$(OutDir)(或$(OutputPath))的子目录中
构建后的操作。或者只是在原地测试exe。
答案 1 :(得分:1)
我不太明白你没有使用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>
或者,您可以保留ProjectReference
,但只是在ResolveProjectReferences
目标之后立即劫持构建过程,并将exe作为依赖项删除(来自_ResolvedProjectReferencePaths
)。
答案 2 :(得分:-1)
我认为你可以使用&#34; copy&#34;任务(可能在项目的 post-build 条件下调用)。
请考虑您只需使用Project -> Project build order
即可在Visual Studio中控制构建顺序。 Visual Studio显示了一个对话框,允许您显式设置项目依赖项:如果您设置Test
项目依赖于Foo
项目而不是Foo
之前正在构建Test
(您可以检查它是否移动到选项卡&#34;在同一个Visual Studio对话框中构建顺序&#34;。