【问题标题】:Can I pass VisualStudio Edition name through a compiler option?我可以通过编译器选项传递 VisualStudio 版本名称吗?
【发布时间】:2015-06-17 13:49: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 版本传递给编译器?还是有其他方法?

【问题讨论】:

    标签: c# visual-studio unit-testing vs-unit-testing-framework compiler-options


    【解决方案1】:

    在文本编辑器中打开 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 是一种冒险的生活 :-)

    【讨论】:

    • 我体验过,一旦您手动编辑了 CSPROJ 文件,VS tends to mess up the file in the future
    • 为了面向未来,您可能还需要检查Enterprise(因为 Ultimate 将成为 VS2015 的企业版)
    • @UweKeim 是的...当您手动编辑它时,可能会出现问题。例如在这种情况下,这个PropertyGroup 必须是最后一个PropertyGroup,因为它的DefineConstants“知道”它必须“附加”。因此,如果您添加新的配置/平台,一切都可能会中断(因为新的配置/平台可以放在“之后”这个)
    • 它在设计时工作,根据 VS 版本启用和禁用代码。非常棒!谢谢!
    【解决方案2】:

    虽然@xanatos 的答案是您所要求的,但我将建议另一种方法。您不必将所有测试放在同一个程序集中。

    如果您将已填充的测试与常规测试放在单独的程序集中,那么您可以选择创建另一个解决方案(因此您有一个带有填充的程序集,一个没有),或者让团队成员使用较低版本的 Visual Studio 从他们的解决方案中卸载已填充的项目。

    如果您要走卸载项目路线,那么选择的已卸载项目将保存在解决方案的“.suo”文件中(您不应该将其放入源代码管理中)。这意味着即使将新项目添加到解决方案中,卸载的项目也将继续卸载。

    这是对问题的透明解决方案(因此您不必担心团队会忘记它的工作原理),不需要手动编辑项目文件,也不需要您记住将您所有的特定测试包装在#ifs 中。它是否适合您的团队取决于您对解决方案和项目结构的整体方法。

    【讨论】:

    • 这是一个很好的观点。我现在不能选择这种方式,但我真的会在下一个项目中考虑这个选项,因为它非常简单和干净,而且我真的不喜欢代码上的#IF。比你也多。
    猜你喜欢
    • 2017-05-09
    • 2020-08-15
    • 2017-11-01
    • 2014-03-06
    • 2011-11-01
    • 1970-01-01
    • 2012-09-23
    相关资源
    最近更新 更多