Igo*_*gor 2 c# code-contracts visual-studio-2013 azure-devops
我最近在我的解决方案中添加了代码合同.经过一些修改后,我们的构建运行没有任何问题,但由于代码合同,我们的单元测试失败.
环境:
Debug和Release DoNotBuild为自定义配置设置了标志BuildServer/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.这意味着它不是我们的构建服务器,我们无法控制构建服务器上安装的内容.即便如此,我们仍希望使用代码合同.下面接受的答案是一种允许这种情况的方法.
请阅读代码合同手册.它告诉你需要知道的一切.您不需要ConditionalAttribute在方法上定义任何内容.Contract.Requires<TException>(bool condition)如果您知道这样做的要求,您可以使用.
作为@Mixxiphoid自己回答说,因为他们使用的通用形式要求,需要代码契约要在构建服务器上安装和 [执行运行时检查合同需求释放配置启用除了调试配置.
如果您使用代码约定,那么您将始终需要在构建调试版本的构建服务器上安装代码契约.您的团队也是如此:所有需要编译代码的开发人员都需要为Debug版本安装代码契约.
这完全在第5部分:代码合同手册中的使用指南中.第20页上有一个有用的图表,可以很好地总结各种使用场景及其要求.
Contract.Requires<TException>(bool condition)首先,为代码合同编写此方法的开发人员不会忘记ConditionalAttribute将该方法应用于该方法,如接受的答案所述.离得很远.这个方法没有用该属性修饰的事实是设计的.
如果您阅读第5节:使用指南,您会看到如果您使用此Requires方法的形式,那么您需要使用二进制重写器ccrewrite- 在构建程序集时.这意味着任何构建组件的机器都必须ccrewrite可用.
那么,你可能无法控制的构建服务器呢?我很高兴你问.
关于TFS托管构建服务器:确实,您不能简单地在构建服务器上安装代码约定.那么你有什么选择呢?
Contract.EndContractBlock()或限制自己仅使用Contract.Requires(bool condition)(非泛型形式),或两者的混合.
上面链接的博客文章提供了修改TFS托管构建控制器托管构建的说明.
更新: 对于那些使用托管构建服务(例如Visual Studio Online,AppVeyor等)的人来说,新的社区驱动的Code Contracts GitHub repo最近宣布了v1.10.xxxxx.RC1.在发行说明中,他们提到了NuGet版本的代码合同.请享用.
| 归档时间: |
|
| 查看次数: |
1545 次 |
| 最近记录: |