首页 > 后端开发 > C++ > 当 Moq 不直接支持扩展方法时,如何使用 Moq 模拟扩展方法?

当 Moq 不直接支持扩展方法时,如何使用 Moq 模拟扩展方法?

DDD
发布: 2025-01-20 02:16:09
原创
190 人浏览过

How Can I Mock Extension Methods with Moq When It Doesn't Directly Support Them?

单元测试中的模拟扩展方法:一种实用方法

单元测试通常需要模拟扩展方法,由于缺乏直接支持,这项任务最初在 Moq 中似乎存在问题。 这源于扩展方法的本质:它们本质上是扩展现有类的静态方法。 然而,Moq 主要模拟对象实例,而不是静态方法。

解决方案在于理解扩展方法向类添加功能。 因此,我们不是模拟扩展方法本身,而是模拟 target 类。

让我们看一个常见的场景:

<code class="language-csharp">public class SomeType {
    public int Id { get; set; }
}

// ... (Extension method definition elsewhere) ...</code>
登录后复制

提供的示例显示需要模拟应用于 FirstOrDefaultList<SomeType> 扩展方法。 我们不是直接模拟 FirstOrDefault,而是创建 List<SomeType> 的模拟:

<code class="language-csharp">var listMock = new Mock<List<SomeType>>();
listMock.Setup(l => l.FirstOrDefault(st => st.Id == 5))
        .Returns(new SomeType { Id = 5 });</code>
登录后复制

此设置允许我们定义使用指定谓词调用时 FirstOrDefault 扩展方法的返回值。 我们通过列表对象的模拟来间接控制行为。

这种技术有效地绕过了 Moq 的限制,实现了全面的单元测试,包括涉及扩展方法的场景。 通过专注于模拟扩展方法所操作的对象,我们可以控制其行为并实现稳健的测试覆盖率。

以上是当 Moq 不直接支持扩展方法时,如何使用 Moq 模拟扩展方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板