我最近在我的解决方案中添加了代码合同。进行一些修改后,我们的构建没有任何问题,但是由于代码合同,我们的单元测试失败了。
环境:
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不允许要在构建服务器上安装的自定义扩展程序)。我只是想忽略构建服务器上的代码协定,但是执行单元测试似乎没有做到这一点。
有人对我需要在哪里确保单元测试忽略代码约定有任何想法吗?似乎应该这样吧?也许我可以在构建定义中设置另一个标志,以供单元测试使用?
编辑
请注意,构建服务器作为Microsoft服务托管在云中,作为Visual Studio Team Services(以前称为Visual Studio Online)的一部分。这意味着它不是我们的构建服务器,我们无法控制构建服务器上安装的内容。即使如此,我们仍要使用代码合同。下面接受的答案是允许这种情况的一种方式。
请,请阅读《代码合同》手册。它告诉您所有您需要知道的内容。您不需要ConditionalAttribute
在方法上定义任何内容。Contract.Requires<TException>(bool condition)
如果您知道这样做的要求,则可以使用。
作为@Mixxiphoid自己回答说,因为他们使用的通用形式要求,需要代码契约要在构建服务器上安装和 [执行运行时检查合同需求释放配置启用除了调试配置。
如果使用的是Code Contracts,则始终需要在生成Debug版本的生成服务器上安装Code Contracts。您的团队也是如此:所有需要编译代码的开发人员都将被要求安装用于调试版本的代码合同。
全部内容都在《代码合同》手册的第5节:使用指南中。第20页上有一个有用的图表,其中概要介绍了各种使用场景及其要求。
Contract.Requires<TException>(bool condition)
首先,为代码合同编写此方法的开发人员不会忘记将它应用于ConditionalAttribute
该方法,正如公认的答案所言。离得很远。此方法未使用该属性修饰的事实是设计使然。
如果您阅读了第5节:使用指南,就会发现如果使用这种形式的Requires
方法,那么在ccrewrite
构建程序集时就需要使用二进制重写器。这意味着将要构建您的程序集的任何计算机都必须ccrewrite
可用。
那么,您可能无法控制的构建服务器又如何呢?我很高兴你问。
关于TFS托管的构建服务器:的确,您不能简单地在构建服务器上安装代码协定。那么您有什么选择呢?
Contract.EndContractBlock()
或者将自己限制为仅使用Contract.Requires(bool condition)
(非泛型形式),或将二者结合使用。
上面链接的博客文章中包含有关修改TFS托管构建控制器托管构建的说明。
更新:很快就会出现代码合同的一些变化对于使用托管构建服务(例如Visual Studio Online,AppVeyor等)的那些人,新的社区驱动的代码合同GitHub repo最近宣布了v1.10.xxxxx.RC1。。在发行说明中,他们提到了NuGet版本的代码合同。享受。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句