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

2023-12-26

我最近将代码契约添加到我的解决方案中。经过一些修改后,我们的构建运行没有任何问题,但我们的单元测试由于代码契约而失败。

环境:

  • 源代码控制和构建服务器托管在Visual Studio 团队服务 https://www.visualstudio.com/en-us/get-started/build/build-your-app-vs(VSTS) 脚本化构建 (以前的VSO)
  • VS 2013 高级代码 (现在 VS 2015 企业版) 配置上启用的合约Debug and Release
  • 代码合约已关闭DoNotBuild为自定义配置设置标志BuildServer
  • Visual Studio Team Services https://www.visualstudio.com/en-us/get-started/build/build-your-app-vs build definition:
    1. 有步骤Visual Studio
    2. 已设置标志/p:CodeContractsEnableRuntimeChecking=false;CodeContractsReferenceAssembly=false

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

测试方法 Web.Tests.AccountControllerTests.CreateAccount_Pass_NoPasswordSend_Test 引发异常:System.Diagnostics.Contracts.ContractException:An 程序集(可能是“Cms.Web”)必须使用代码重写 合同二进制重写器(CCRewrite),因为它正在调用 Contract.Requires 和 CONTRACTS_FULL 符号是 定义的。删除 CONTRACTS_FULL 符号的任何显式定义 从您的项目中进行重建。

我检查了构建服务器的诊断输出,没有任何符号CONTRACTS_FULL随处可见。

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

有人知道我需要在哪里寻找以确保单元测试忽略代码契约吗?看起来这应该是可能的吧?也许我可以在构建定义中设置另一个标志,该标志将由单元测试选取?


Edit

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


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

正如 @Mixiphoid 在他们的回答中所说,因为他们使用的是 Requires 的通用形式,所以需要在构建服务器上安装代码契约and 执行运行时契约检查需要为Release配置启用此外调试配置。

如果您使用代码合同,那么您将always需要在构建调试版本的构建服务器上安装代码合约。您的团队也是如此:所有需要编译代码的开发人员都需要安装代码合约以进行调试构建。

一切都在第 5 节:使用指南在代码合同手册中。有一个有用的图表page 20这很好地总结了各种使用场景及其要求。


About Contract.Requires<TException>(bool condition)

首先,为代码合约编写此方法的开发人员did not忘记应用ConditionalAttribute正如已接受的答案所述,该方法。离得很远。该方法没有用该​​属性修饰的事实是按设计.

如果你读过第 5 节:使用指南,你会发现如果你使用这种形式Requires方法,那么你需要使用二进制重写器——ccrewrite- 构建装配体时。这意味着任何构建装配体的机器都必须具有ccrewrite可用的。

那么,如何构建您可能无法控制的服务器呢?我很高兴你问了。


TFS 托管构建服务器

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

  1. You could limit yourself to using only the "legacy" form of code contracts, if-then-throw blocks followed by Contract.EndContractBlock() or limit yourself to only using Contract.Requires(bool condition) (the non-generic form), or a mixture of the two.
    • 无论哪种情况,您可能都希望为 TFS 托管的构建服务器提供单独的调试构建配置。这个构建配置将有执行运行时契约检查对该构建配置禁用。
  2. 你可以做一点“bing-ing”或“google”并想出this http://blog.mycupof.net/2013/03/30/team-foundation-service-make-codecontracts-work-on-a-hosted-build-agent/搜索结果,描述如何在 TFS Online 上使用代码合同构建解决方案。

上面链接的博客文章包含修改 TFS 托管构建控制器托管构建的说明。

更新:很快就会有 NUGET 版本的代码合约对于那些使用托管构建服务(例如 Visual Studio Online、AppVeyor 等)的人来说,新的社区驱动的代码合同 GitHub 存储库最近发布了v1.10.xxxxx.RC1。在发行说明中,他们提到了代码合约的 NuGet 版本 https://github.com/Microsoft/CodeContracts/issues/13. Enjoy.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码合同 - Visual Studio Team Service 脚本化构建服务器单元测试失败 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 私有模板函数

    我有一堂课 C h class C private template
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi
  • 找不到 securityToken 的有效键映射

    我正在开发测试应用程序 用于在 MVC ASP net Visual studio 2013 中显示经过身份验证的身份声明 我已通过以下方式从活动目录进行身份验证 1 在解决方案中添加新的mvc项目 2 单击更改身份验证 3 选择组织账户

随机推荐

  • 使用 DS.FixtureAdapter 时无法查询 Emberjs 模型

    我无法查询我的模型 我不知道我做错了什么 我的商店定义为 App Store DS Store extend revision 12 adapter DS FixtureAdapter 我的模型定义了 var Feature DS Mode
  • Tkinter - 如何在文本框的开头插入文本?

    我正在使用 Python 2 7 5 和 Tkinter 我正在将状态消息写入文本小部件 要插入我正在使用 text widget insert INSERT my status here n 这很好用 但是 每个状态都会添加到前一个状态之
  • C++11 中将函数作为模板参数传递的新方法有哪些?

    在问题中作为模板参数传递的函数 https stackoverflow com questions 1174169 function passed as template argument 有人询问并解释说 在 C 中有两种将函数作为模板参
  • 将表单中的数据输入数据库 PDO

    我学习了 MySQL 创建了一个表单并让它与数据库一起工作 然后我被告知我应该使用准备好的语句来执行 PDO 所以我对此做了一些研究并更改了我的代码 我现在的代码是正确的 我认为 但我无法弄清楚数据如何输入 正如您在我的代码中看到的 我让数
  • Eclipse中运行到光标处的快捷键是什么?

    Eclipse Indigo 中 运行到光标 的快捷键是什么 The function that you need in eclipse is called Run to Line and you should call it with C
  • 如何从发送到NodeMCU的lua中的http请求获取post参数

    我通过 Tasker Android 应用程序 将此 HTTP POST 请求发送到我的 NodeMCU 如下所示 POST HTTP 1 1 Content Type application x www form urlencoded U
  • HTTP/2 流与 HTTP/1.1 连接

    如果我们忽略 HTTP 1 1 中创建新连接的开销 是否存在连接性能比 HTTP 2 流更好的情况 我对页面加载时间进行了一些性能测试 发现对于响应较大的请求 HTTP 1 1 https 的性能优于 HTTP 2 然后 当我开始增加并发级
  • 如何从 Eclipse 项目中排除某些文件夹?

    我正在向我们现有的代码库添加一个 eclipse 项目 我想知道是否有办法完全排除某些目录被 eclipse 拾取 原因是我们的存储库中有一个巨大的 第三方 目录 该目录无法出现在项目中结对编程 https stackoverflow co
  • 锚标记 与 Shadow dom 内的哈希值

    我想在使用 Shadow DOM 的自定义元素内使用带有哈希 URL 的锚元素 我希望浏览器向下滚动到该锚点 但它没有这样做 至少 Chrome 是这样 Detail 我有一个像这样的index html a href destinatio
  • “浮动”的最大值是多少? [复制]

    这个问题在这里已经有答案了 当我检查 float MaxValue 的值时 我得到 3 402823E 38 这是 340 282 300 000 000 000 000 000 000 000 000 000 000 那么为什么当我尝试为
  • 如何调用 shell 脚本并从另一个 shell 脚本传递参数

    我正在从另一个 shell 脚本调用 shell 脚本 并且被调用的脚本需要一些输入 命令行 参数 我有下面提到的代码 但那不起作用 我不知道为什么参数值没有传递给被调用的脚本 script1 sh bin bash ARG1 val1 A
  • 如何通过网络在两个 VB.NET 应用程序之间进行通信

    我正在使用 VB NET 进行编程 我想将一个字符串或一个整数从一个 VB NET 应用程序发送到不同计算机上的另一个 VB NET 应用程序 我看了一些教程 但所有教程都只能在本地网络上运行 我希望它可以在互联网上运行 这是我的本地连接代
  • 远程服务器返回意外响应:(400) 错误请求

    我收到异常 远程服务器返回意外响应 400 错误请求 我不知道原因 web config 看起来不错 但也许我没有看到问题
  • firebase 如何检测“app_remove”

    在 Android 应用程序的 Firebase 分析中 我可以看到 app remove 事件 但 Android 操作系统不提供任何回调来检测应用程序是否被卸载 那么 firebase 是否真的知道 app remove 事件是否发生了
  • Google Java 风格的 Checkstyle 规则

    是否有一个 Checkstyle 规则文件谷歌Java风格 http google styleguide googlecode com svn trunk javaguide html checkstyle 团队几天前添加了它 这里是 ht
  • 是什么让 Smalltalk 能够进行图像持久化,为什么像 Ruby/Python 这样的语言不能自我序列化?

    在smalltalk中 您可以将世界状态保存到图像文件中 我认为这与 Smalltalk 的 序列化 自身能力有关 也就是说 对象可以生成自己的源代码 1 这是一个准确的理解吗 2 将这种能力添加到现代语言 显然是非 Lisp 中面临的挑战
  • 使用 Cython 生成的可执行文件真的没有源代码吗?

    我读过了在 Cython 中制作可执行文件 https stackoverflow com questions 22507592 making an executable in cython和 BuvinJ 的回答如何有效混淆Python代
  • 以编程方式选择 Kendo 网格行

    我找到了类似标题的帖子 但仍然无法解决我的问题 我肯定做错了什么 在 Kendo 网格配置中 有一些函数可以获取上下文 网格 并读取所选行 change function e refresh this 这就是我配置 更改 事件的方式 在函数
  • Pygame.movi​​e 丢失[重复]

    这个问题在这里已经有答案了 我目前正在使用 RPi 3B 最新的 Raspbian Jessie 进行一个小项目 其中涉及播放短的 mp4 文件 由于 Pygame 似乎支持播放 mpg 文件 因此我将视频转换为该格式 然而 当我尝试导入电
  • 代码合同 - Visual Studio Team Service 脚本化构建服务器单元测试失败

    我最近将代码契约添加到我的解决方案中 经过一些修改后 我们的构建运行没有任何问题 但我们的单元测试由于代码契约而失败 环境 源代码控制和构建服务器托管在Visual Studio 团队服务 https www visualstudio co