我可以通过编译器选项传递VisualStudio Edition名称吗?
本文关键字:Edition VisualStudio 可以通过 编译器 选项 | 更新日期: 2023-09-27 17:56:56
我正在使用Microsoft.QualityTools.Testing.Fakes来模拟一些单元测试。
但是这个程序集只对使用VisualStudio Ultimate的用户可用。
使用其他版本(专业版)的用户无法生成和运行此测试项目,并且这会在其环境中出错。
所以我创建了一个编译器指令来处理这个问题:
#define Ultimate
#if Ultimate
using Microsoft.QualityTools.Testing.Fakes;
#endif
我的测试方法是:
#if Ultimate
using (ShimsContext.Create())
{
... My code
}
#else
Assert.Inconclusive("This test needs VS Ultimate to run");
#endif
这很好用,但用户仍然需要注释/取消注释定义行。
那么,有没有办法将我的VS版传递给编译器?还是有另一种方法?
在文本编辑器中打开 csproj,并在最后一个<PropertyGroup>
后添加:
<PropertyGroup Condition=" $(VisualStudioEdition.Contains('Ultimate')) ">
<DefineConstants>$(DefineConstants);ULTIMATE</DefineConstants>
</PropertyGroup>
请注意,我已经以全大写形式编写了常量,因此您必须将代码更改为:
#if ULTIMATE
如果您想按照@Damian的建议使自己适应未来:
<PropertyGroup Condition=" $(VisualStudioEdition.Contains('Ultimate')) Or $(VisualStudioEdition.Contains('Enterprise')) ">
<DefineConstants>$(DefineConstants);ULTIMATE</DefineConstants>
</PropertyGroup>
请注意,正如@Uwe所写,这些是"黑客"......手动编辑CSPROJ过着冒险的生活:-)
虽然@xanatos的答案是你所要求的,但我将建议另一种方法。 不必将所有测试放在同一个程序集中。
如果将填充程序测试放在与普通测试不同的程序集中,则可以选择创建另一个解决方案(因此,一个具有填充程序集,另一个没有填充程序集),或者让具有较低版本的 Visual Studio 的团队成员从其解决方案中卸载填充项目。
如果要沿着卸载的项目路线前进,则卸载的项目选择将保存在解决方案的".suo"文件中(不应将其放入源代码管理中)。 这意味着,即使将新项目添加到解决方案中,卸载的项目也将继续卸载。
这是该问题的透明解决方案(因此您无需担心团队将来会忘记它的工作方式),不需要手动编辑项目文件,也不需要您记住将所有特定测试包装在#if
s中。 它是否适用于您的团队取决于您的解决方案和项目结构的整体方法。