代码约定 - Visual Studio Team Service脚本构建服务器单元测试失败

Igo*_*gor 2 c# code-contracts visual-studio-2013 azure-devops

我最近在我的解决方案中添加了代码合同.经过一些修改后,我们的构建运行没有任何问题,但由于代码合同,我们的单元测试失败.

环境:

  • 源代码控制和构建服务器托管在Visual Studio Team Service(VSTS)脚本构建(以前称为VSO)上
  • VS 2013 Premium Code(现为VS 2015 Enterprise)合同已启用配置DebugRelease
  • 代码合约已关闭,并DoNotBuild为自定义配置设置了标志BuildServer
  • Visual Studio Team Services构建定义:
    1. 有步骤Visual Studio
    2. 有标志设置 /p:CodeContractsEnableRuntimeChecking=false;CodeContractsReferenceAssembly=false

构建服务器中的示例错误文本:

测试方法Web.Tests.AccountControllerTests.CreateAccount_Pass_NoPasswordSend_Test抛出异常:System.Diagnostics.Contracts.ContractException:必须使用代码契约二进制重写器(CCRewrite)重写一个程序集(可能是"Cms.Web"),因为它正在调用Contract.Requires和CONTRACTS_FULL符号已定义.从项目中删除CONTRACTS_FULL符号的任何显式定义并重建.

我已经检查了构建服务器的诊断输出,并且没有CONTRACTS_FULL可以在任何地方找到的符号.

我不想在构建服务器上启用代码合同,主要是因为我之前尝试过没有成功,并且由于时间限制我放弃了(经过更多搜索后我得出结论,这是不可能的,因为微软不允许要在构建服务器上安装的自定义扩展.我只是想忽略构建服务器上的代码契约,但单元测试执行似乎没有这样做.

任何人对我需要查看的位置有任何想法,以确保单元测试忽略代码合同?看起来这应该是可能的吗?也许我可以在构建定义中设置另一个标志,它将被单元测试选中?


编辑

请注意,构建服务器作为Microsoft服务作为Visual Studio Team Services(以前称为Visual Studio Online)的一部分在云中被HOSTED.这意味着它不是我们的构建服务器,我们无法控制构建服务器上安装的内容.即便如此,我们仍希望使用代码合同.下面接受的答案是一种允许这种情况的方法.

fou*_*ght 6

请阅读代码合同手册.它告诉你需要知道的一切.您不需要ConditionalAttribute在方法上定义任何内容.Contract.Requires<TException>(bool condition)如果您知道这样做的要求,您可以使用.

作为@Mixxiphoid自己回答说,因为他们使用的通用形式要求,需要代码契约要在构建服务器上安装 [执行运行时检查合同需求释放配置启用除了调试配置.

如果您使用代码约定,那么您将始终需要在构建调试版本的构建服务器上安装代码契约.您的团队也是如此:所有需要编译代码的开发人员都需要为Debug版本安装代码契约.

这完全在第5部分:代码合同手册中的使用指南中.第20页上有一个有用的图表,可以很好地总结各种使用场景及其要求.


关于 Contract.Requires<TException>(bool condition)

首先,为代码合同编写此方法的开发人员不会忘记ConditionalAttribute将该方法应用于该方法,如接受的答案所述.离得很远.这个方法没有用该​​属性修饰的事实是设计的.

如果您阅读第5节:使用指南,您会看到如果您使用此Requires方法的形式,那么您需要使用二进制重写器ccrewrite- 在构建程序集时.这意味着任何构建组件的机器都必须ccrewrite可用.

那么,你可能无法控制的构建服务器呢?我很高兴你问.


TFS托管构建服务器

关于TFS托管构建服务器:确实,您不能简单地在构建服务器上安装代码约定.那么你有什么选择呢?

  1. 您可以限制自己仅使用代码契约的"遗留"形式,if-then-throw块后跟Contract.EndContractBlock()或限制自己仅使用Contract.Requires(bool condition)(非泛型形式),或两者的混合.
    • 在任何一种情况下,您可能都希望为TFS托管的构建服务器提供单独的Debug构建配置.此构建配置将禁用该构建配置的" 执行运行时协定检查".
  2. 您可以进行一些"bing-ing"或"Google搜索"并提出搜索结果,搜索结果描述了如何使用TFS Online上的代码合同来构建解决方案.

上面链接的博客文章提供了修改TFS托管构建控制器托管构建的说明.

更新: 对于那些使用托管构建服务(例如Visual Studio Online,AppVeyor等)的人来说,新的社区驱动的Code Contracts GitHub repo最近宣布了v1.10.xxxxx.RC1.在发行说明中,他们提到了NuGet版本的代码合同.请享用.