2014-04-11 70 views
2

我有一个运行程序的测试项目(一个.exe),并确保结果按预期发布。如何在不链接到csproj的情况下引用项目?

我想声明的是测试项目取决于构建.exe项目,以及.exe下降放入的$(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

“ProjectReference”有什么问题?假如你的测试项目只是一个测试类,那么它对被测试项目的认识是有效的。 – KMoraz

+0

@KMoraz:这会导致该项目的输出被声明为程序集引用,这在这里不合适。我想测试产品,因为它将被部署 - “ProjectReference”会隐藏错误,因此测试项目会部署产品所依赖的二进制文件(但产品本身不会复制)。 –

回答

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)。

+0

不幸的是,这会导致产品被构建两次:/虽然比没有更好。 –

+0

@BillyONeal编辑为不允许构建两次的版本。希望它有帮助,不管没有使用ProjectReference的原因是什么。 – makhdumi

+0

+1 :)我会使用ProjectReference,但我不希望测试代码能够直接引用产品类型。 –

-1

我认为,你可以使用“复制”任务来完成该任务(可能会在项目的后期制作条件中调用)。

请考虑您可以使用Project -> Project build order来控制Visual Studio中的构建顺序。 Visual Studio中显示一个对话框,让你明确地设置项目的依赖关系:如果你设置你的Test项目取决于你Foo项目比Foo正在建立之前Test(你可以检查其移动到标签“构建顺序”在同一个Visual Studio中对话)。

+0

项目构建顺序(如上所述)不适用于msbuild。它需要使用解决方案文件进行构建,这对我来说不是一种选择。 –

0

我想声明的是测试项目取决于构建的.exe项目...

设置ReferenceOutputAssemblyfalse对项目引用(source):

<ProjectReference Include="..\ProjectA\ProjectA.csproj"> 
    <Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project> 
    <Name>ProjectA</Name> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
</ProjectReference> 

...,并将该.exe落入的$(OUTDIR)子目录(或$(OutputPath))

构建后操作。或者就地运行被测试的exe文件。

相关问题