迭代器块的测试覆盖率结果很奇怪,为什么这些语句没有执行?

2024-02-28

我正在使用 dotCover 来分析单元测试的代码覆盖率,并且得到一些奇怪的结果...我有一个迭代器方法,其覆盖范围不完整,但未覆盖的语句只是右大括号在该方法的末尾。

这是我正在测试的方法:

    public static IEnumerable<T> CommonPrefix<T>(
        this IEnumerable<T> source,
        IEnumerable<T> other,
        IEqualityComparer<T> comparer)
    {
        source.CheckArgumentNull("source");
        other.CheckArgumentNull("other");

        return source.CommonPrefixImpl(other, comparer);
    }

    private static IEnumerable<T> CommonPrefixImpl<T>(
        this IEnumerable<T> source,
        IEnumerable<T> other,
        IEqualityComparer<T> comparer)
    {
        comparer = comparer ?? EqualityComparer<T>.Default;

        using (IEnumerator<T> en1 = source.GetEnumerator(),
                              en2 = other.GetEnumerator())
        {
            while (en1.MoveNext() && en2.MoveNext())
            {
                if (comparer.Equals(en1.Current, en2.Current))
                    yield return en1.Current;
                else
                    yield break;
            }
        } // not covered
    } // not covered

单元测试:

    [Test]
    public void Test_CommonPrefix_SpecificComparer()
    {
        var first = new[] { "Foo", "Bar", "Baz", "Titi", "Tata", "Toto" };
        var second = new[] { "FOO", "bAR", "baz", "tata", "Toto" };

        var expected = new[] { "Foo", "Bar", "Baz" };
        var actual = first.CommonPrefix(second, StringComparer.CurrentCultureIgnoreCase);
        Assert.That(actual, Is.EquivalentTo(expected));
    }

覆盖结果:

我假设右大括号using块实际上是调用Dispose在枚举器上;但是,为什么它没有被执行呢?我首先怀疑 NUnit 没有处理枚举器,但如果我在上面执行 foreach ,我会得到相同的结果actual.

至于第二个未覆盖的右大括号,我不知道它代表什么......我猜它与编译器如何转换迭代器块有关。

谁能解释一下这两个“声明”是什么,以及为什么它们没有被执行?


编辑:彼得提出了一个非常好的问题:上面显示的结果是在运行测试时获得的调试构建。如果我在发布版本,覆盖范围CommonPrefixImpl方法是100%,所以这可能与编译器优化有关。


迭代器方法的问题之一是编译器生成相当大且复杂的状态机来管理迭代器方法内代码的延迟执行。这通常会生成一两个类。这些类旨在处理一般情况,而不是您的特定情况,因此其中可能至少有一些从未使用过的代码。您可以使用 ILSpy、JustDecompile 或 Reflector 等工具查看程序集来查看生成的内容。它将显示 C# 编译器生成的程序集中的类(通常类名包含“

探查器知道的是 PDB 如何与您的代码关联,尽管所有代码都有可能你写了可能正在执行,但仍有可能并非编译器生成的所有代码都被执行。探查器可能不知道这一点,只是简单地说特定迭代器方法的一定百分比(小于 100)已执行。

可能生成的内容之一是异常处理代码。因为编译器不知道您的代码不会或可能无法生成异常,所以它仍然会生成代码来补偿异常——它需要防止其状态被损坏。我敢打赌,如果您基于某个标志在迭代器方法的各个位置包含一种抛出异常的方法,并运行该方法两次(一次没有异常,一次在同一运行中出现异常),那么百分比会有所不同 - 可能会更高因为随后将执行生成的异常处理代码。

该方法的结尾“似乎”没有被执行,这可能是因为该代码是状态机中执行的不同方法的一部分,并且编译器永远不会生成从生成的代码到类中的代码的关联。

UPDATE:为了更好地理解编译器正在做什么并查看它生成的代码类型的示例,请参阅部分10.14 迭代器在 C# 规范中(http://www.microsoft.com/en-us/download/details.aspx?id=7029 http://www.microsoft.com/en-us/download/details.aspx?id=7029)

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

迭代器块的测试覆盖率结果很奇怪,为什么这些语句没有执行? 的相关文章

  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 如何查找boost运行时版本

    我正在编写一个使用 boost 的 C 库 在这个库中 我想包含有关用于编译我的库的二进制版本的 boost 版本的信息 我可以使用宏BOOST VERSION这很好 我还想确定哪个是 boost 的运行时版本 以便我可以与用于编译我的库的
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 使用 C 创建立体声正弦波

    我正在尝试用 C 创建立体声正弦 WAV 并且可能有不同的 可能是空白的 左声道和右声道 使用此函数为每个通道生成一个音调 int16 t create tone float frequency float amplitude float
  • c++11 中的 std::thread 问题

    我在尝试从标准模板库编译具有多线程的程序时遇到一些麻烦 当我尝试编译以下程序时 它返回一个晦涩的错误 include
  • C++ 克隆惯用语中协变返回类型的用处?

    通常的克隆习惯使用协变返回类型 struct Base virtual Base clone struct Derived public Base Derived clone 我读过一些内容 大意是协变返回类型是 C 后来添加的 较旧的编译
  • 为什么std::string在发布时是标准布局类型,但在调试时不是标准布局类型?

    include
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 是否可以存根实体框架上下文和类来测试数据访问层?

    我熟悉用于测试 ASP NET MVC 应用程序中的控制器和业务逻辑的技术 我们的应用程序中的数据访问集中在松散耦合的特殊服务中 使用接口并通过实体框架与实际数据库一起使用 然而 随着 DAL 变得越来越复杂 隐藏数据库实现细节并为应用程序
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 无论表单上的焦点控件如何,如何捕获 Keys.F1?

    我使用了 KeyDown 事件和一些简单的代码 例如if e KeyCode Keys F1 捕获在表单上按下 F1 但如果表单上有一些文本框 或者表单上有一些带有 Dock Fill 的电子表格 则上面的代码将毫无用处并且不执行任何操作
  • 我可以在C中直接比较int和size_t吗?

    我可以比较一个int and a size t像这样的变量 int i 1 size t y 2 if i y Do something 或者我必须输入其中之一 只要满足以下条件 它就是安全的int为零或正数 如果它是负数 并且size t
  • PHP 启动:运行单元测试时无法加载动态库

    当我尝试运行单元测试时 出现此错误 PHP 警告 PHP 启动 无法加载动态库 bz2 尝试过 xampp php ext bz2 找不到指定的模块 xampp php ext php bz2 dll 找不到指定的模块 在未知的第 0 行
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • 为什么C#不支持多重继承? [复制]

    这个问题在这里已经有答案了 可能的重复 C 应该包含多重继承吗 https stackoverflow com questions 191691 should c include multiple inheritance 为什么C 不支持多
  • 组合框由于某种原因被链接

    我有以下代码来填充 3 个组合框 private void PopulateDDLs SqlConnection connection SqlCommand command SqlDataReader reader DataTable dt
  • 当另一个进程使用 std::fstream 写入文件时从文件读取[重复]

    这个问题在这里已经有答案了 我需要从文件中逐行读取 它是由 std getline 完成的 另一个进程的问题是一直向其附加数据 然后我需要读取新行 例如 文件一开始包含10行 我的程序读取了10行 那么我的程序应该等待 过了一会儿 另一个进
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐

  • ruby ssh:交互式命令“su”:成功登录后如何进一步?

    我想在 SSH 会话中的远程计算机上工作 登录远程服务器 su 做我的工作 使用我的脚本 a 可以完成步骤 1 和 2 的工作 在执行 su 命令时 我可以发送密码 并得到了我期望的答案 on data data gis v04ree gt
  • 在索引处每行插入多个值

    我正在尝试矢量化以下操作 将较小的数组放入较大的数组中 从而使每行的索引随着另一个数组的函数而变化 示例数据 array large 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 array small 1 2 3 4 5 6
  • Linux 和 Windows 上的 Python sys.maxint、sys.maxunicode

    在 64 位 Debian Linux 6 上 Python 2 6 6 r266 84292 Dec 26 2010 22 31 48 GCC 4 4 5 on linux2 Type help copyright credits or
  • 如何判断用户是否选择了浅色主题或深色主题

    有没有办法判断用户是否选择了浅色主题或深色主题 Thanks 有一个属性可以对此进行测试 而不是比较实际的资源颜色 Visibility v Visibility Resources PhoneLightThemeVisibility if
  • 函数 try 块是否允许我们解决异常?

    所以我正在阅读有关函数 try 块的内容link https www learncpp com cpp tutorial 14 7 function try blocks 还有一行描述了普通 try 块和函数 try 块之间的区别 如下所示
  • 一次性登录应用程序 - FirebaseAuth

    我正在开发一个使用 Firebase 身份验证通过电话号码登录用户的应用程序 我想添加一项功能 使用户只能一次性登录 即即使用户杀死应用程序并再次启动它 他也应该登录 另外 我不想添加注销功能 为此可以做什么 实现此目的的最简单方法是使用侦
  • java LocalDateTime 解析具有模式 MM/d/yyyy HH:mm:ss a 的日期的异常

    我在使用 java datetime API 执行下面的代码时遇到异常 String strDate 12 4 2018 5 26 28 PM DateTimeFormatter formatter DateTimeFormatter of
  • Spring 3 表达式语言如何与属性占位符交互?

    Spring 3 引入了新的表达语言 http docs spring io spring docs 3 0 x spring framework reference html expressions html SpEL 可以在 bean
  • 如何检测产品搜索中的拼写错误并提出可能的更正建议?

    给定一个非常大的产品名称数据库 您如何检测用户搜索中可能存在的拼写错误并建议可能的更正 有点像谷歌呈现它们的方式 E g 用户输入 fork handels 并按 搜索 他们回来了 没有结果 您是说 叉柄 吗 解决这个问题有几种方法 保留一
  • G++ 找不到 boost 库。我说他们就在众目睽睽之下

    我正在尝试构建一些代码 这是我收到的错误 main o In function static initialization and destruction 0 home jmbeck Downloads boost 1 48 0 boost
  • Visual Studio 2013 缺少转换为 Web 应用程序

    我正在管理一个旧的 Web 应用程序 它仍然具有 Framework 1 的遗留代码 你相信吗 目前使用 Framework 4 0 当我需要修复或升级网页时 我通过单击 转换为 Web 应用程序 将其转换为 Web 应用程序网页 VS 2
  • order Graphviz - 固定子图

    我喜欢创建一个像这样的 3 柱形图 Code digraph g rankdir LR node shape circle fontsize 14 fontsize 18 labeljust l rank same edge style i
  • Docker 容器超时?

    对于我在大学的论文 我正在研究一个编码排行榜系统 用户可以通过临时 Docker 容器编译 运行不受信任的代码 到目前为止 系统似乎运行良好 但我面临的一个问题是 当提交无限循环的代码时 例如 while True print infini
  • Twitter 回调 URL

    我正在使用 twitter SDK 与 ios 应用程序集成 当我遵循所有步骤并创建客户密钥并将其放入我的应用程序中时 当我运行应用程序时 它会显示 TwitterKit 确实遇到了消息错误 获取用户身份验证令牌时出错 错误域 TWTRLo
  • 如何在我自己的 C shell 中正确等待前台/后台进程?

    In this https stackoverflow com questions 873620 how do i clear this array pointer in c上一个问题我发布了大部分我自己的 shell 代码 我的下一步是实
  • 从子查询更新多列

    此类问题之前已被问过几次 但并不完全是我想要的 我需要SET两行等于子查询的不同部分 我目前正在使用 UPDATE records SET leads SELECT COUNT FROM leads table WHERE leads ta
  • 替换字符串中的字符列表

    我有一个字符串 它是网页的标题 所以它可以有 和其他特殊字符 我想编写一个函数 它将接受一个字符串并替换一个字符列表 试图找到最好的方法来做到这一点 我应该使用列表 数组或枚举来保存特殊字符列表 还是 java 中已经有一些东西可以做到这一
  • 如何使单选按钮看起来像切换按钮

    我希望一组单选按钮看起来像一组切换按钮 但功能仍然像单选按钮一样 它们不必看起来完全像切换按钮 我怎样才能只使用 CSS 和 HTML 来做到这一点 编辑 当选中 取消选中按钮时 我会满意地使小圆圈消失并更改样式 根据您想要支持的浏览器 您
  • 具有取消支持的 GetContextAsync()

    所以我正在旋转一个HttpListener等待一个OAuth2回复 在理想的情况下 当用户登录浏览器并且我们收到令牌时 该令牌只会存活几秒钟 我也希望这个有一个CancellationToken以便用户可以在延迟后停止收听 如果他们愿意 我
  • 迭代器块的测试覆盖率结果很奇怪,为什么这些语句没有执行?

    我正在使用 dotCover 来分析单元测试的代码覆盖率 并且得到一些奇怪的结果 我有一个迭代器方法 其覆盖范围不完整 但未覆盖的语句只是右大括号在该方法的末尾 这是我正在测试的方法 public static IEnumerable