如何在 C# 中模拟没有接口和虚方法的类?

2024-03-25

我正在为别人的代码编写单元测试,但我不允许修改这些代码。

假设我有:

class BadClass
{
    public BadClass()
    {
        // the service isn't going to be running during testing
        // it also has no interface
        someFlag = AGloballyStoredService.getSomeFlag();
    }

    public bool someFlag;

}

由以下人员使用:

class AnotherBadClass
{
    public AnotherBadClass(BadClass badClass)
    {
        someFlag = badClass.someFlag;
    }
    public bool someFlag;
}

说我想要测试:

public void AnotherBadClassConstructorTest()
{
    BadClass badClass = new BadClass();
    AnotherBadClass anotherBadClass = new AnotherBadClass(badClass);
    Assert.IsNotNull(anotherBadClass);
}

我想模拟 BadClass,但它没有接口,并且如果服务未运行,它在构造函数期间会失败。

考虑到我无法修改正在测试的代码,是否有一种简单的方法可以使其工作?

如果归根结底,我可以告诉他们,他们要么让我修改现有的代码库,要么接受该模块低于 10% 的覆盖率。


考虑到我无法修改正在测试的代码,是否有一个 使这项工作有效的简单方法?

不。但是,我看到两个非直接的选择:

A) Use 微软假货 https://msdn.microsoft.com/en-us/library/hh549175.aspx通过重写库来提供模拟。您不必修改代码。示例:您可以修改静态日期时间.现在返回您选择的日期,如下所示:

System.Fakes.ShimDateTime.NowGet = 
() =>
{ return new DateTime(fixedYear, 1, 1); };

B)您可以尝试继承被测试的类并覆盖使用的方法/构造函数。但有两个限制。您必须能够使用模拟对象实例化/交换测试类的实例(通过使用反射,您可以获取私有成员),并且模拟方法必须是虚拟的。在您的情况下,您将创建:

class BadClassMock : BadClass
{
    public BadClassMock()
    {
    }

    public bool someFlag;

    public void InitForTest()
    {
        someFlag = true;
    }
}

只要您不调用基本构造函数,它就会起作用。你可以使用讨厌的FormatterServices.GetUninitializedObject()技巧从这里开始:使用反射在 C# 中创建没有默认构造函数的类型实例 https://stackoverflow.com/questions/390578/creating-instance-of-type-without-default-constructor-in-c-sharp-using-reflectio

然后:

public void AnotherBadClassConstructorTest()
{
    BadClassMock badClassMock = (BadClassMock)FormatterServices.GetUninitializedObject(typeof(BadClassMock));
    badClassMock.InitForTest();
    AnotherBadClass anotherBadClass = new AnotherBadClass(badClassMock);
    Assert.IsNotNull(anotherBadClass);
}

是的,这是一个相当大的解决方法。显然最好的办法就是说服作者修改代码。

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

如何在 C# 中模拟没有接口和虚方法的类? 的相关文章

  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • Asp.net GridView - 如何在数据绑定之前访问数据源?

    我试图在将数据源绑定到网格之前访问数据源 我怎么做 我想我应该查看像 Grid DataBinding 这样的事件之一 是的 GridView DataBinding 事件将在绑定控件之前引发 您可以在该事件中访问 DataSource 控
  • 在 Windows 10 中找不到模块“internal/util/types”

    我刚刚尝试了很多解决方案来解决此问题 当我执行 npm install 时 我得到 Cannot find module internal util types 我尝试了以下基于 StackOverflow 和 Git 的解决方案 1 从
  • 检查字符串是否为实数[重复]

    这个问题在这里已经有答案了 有没有一种快速的方法来查找字符串是否是实数 而不是一次读取一个字符并执行isdigit 在每个角色上 例如 我希望能够测试浮点数0 03001 如果您将浮点数表示为实数 则这应该有效 def isfloat st
  • Objective-C 中的宏调用 isEqualToString:产生有关无效令牌的错误

    我正在尝试定义一个这样的宏 define SOME DEF TTys getString isEqualToString ANOTHER STRING 然后执行以下操作 if SOME DEF endif TTys getString 返回
  • 通过引用 Cython 传递单个整数?

    我正在尝试让一个测试项目正常运行 该项目调用一个 C 函数 其中有一个需要通过引用传递的整数参数 来自 Python test cpp include
  • 如何将用户输入输入 PackageMaker 包中?

    我正在尝试创建一个安装包 我已经掌握了所有组件 并且我想我了解了大部分过程 我想要一个作为安装一部分运行的安装 设置脚本 我计划将其作为安装后操作或安装后脚本 问题是我需要用户输入 我不知道如何将用户输入添加到脚本中 或者如何在安装 UI
  • 需要刷新页面内容

    我正在使用 codeigniter 框架 目前正在从事社交网络之类的工作 我的问题是 当用户单击提要链接时 我需要通知用户他们的朋友活动 而无需重新加载页面 我尝试过以下脚本 它增加了我的服务器的负载 完成此任务的任何其他想法 提前致谢 然
  • 描述编译时已知的“consteval”函数参数的名称,但 constexpr 不知道

    论证consteval函数是 sort of 编译时已知 but is not 常量表达式 安德鲁 萨顿 Andrew Sutton 在他的论文中解释了这种行为背后的动机翻译和评估 编译时元编程的思维模型 http www open std
  • 下载/缓存 Google 地图以供离线使用[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在 Android 应用程序中实现这一点 并且我认为最新的 Google Maps API 版本可以实现这一点 但我还没有看到关
  • 在简单的 http get 示例中找不到模块“Network.HTTP”

    我正在尝试这个简单的例子 module Main where import Network HTTP import Lib get String gt IO String get url simpleHTTP getRequest url
  • WPF dataGrid查找单个单元格的X和Y并设置背景颜色

    我有一个绑定到数据网格 MVVM 的类型化数据集 我还有一个点列表 输入数据集中的 X 和 Y 表明哪些单元格有错误 检测这一点的逻辑很复杂并且在服务器端运行 我的目标是如果每个单元格有错误 则将其背景绘制为不同的颜色 即点列表包含该单元格
  • Mockk 模拟 Kotlin 中的私有属性

    我有一个带有私有字段的简单类 class EmployeeData private var employeeAge Int 0 fun getAge Int return 1 employeeAge 我正在尝试测试这个私有的employee
  • 下载电子邮件附件时使用 C# 中的 Microsoft Security Essentials

    我正在制作一个简单的程序 使用 VS2010 从 pop3 服务器获取电子邮件 可能会使用开源 OpenPOP 来完成其中的一些工作 然后它应该将电子邮件和附件保存在 MS SQL 数据库中 但问题是 虽然附件很容易从邮件服务器下载 但有没
  • 在 Flutter 桌面应用程序/插件中调试本机 C++ 代码

    我正在为 Flutter 桌面应用程序 Linux 和 Windows 创建本机插件实现 并且我想调试插件的 C 实现 我只找到了如何使用 ios android 平台代码执行此操作的指南 https flutter dev docs te
  • 如何让Jupyter Notebook在GPU上运行?

    在 Google Collab 中 您可以选择笔记本在 CPU 或 GPU 环境上运行 现在我有一台配备 NVDIA Cuda 兼容 GPU 1050 和最新 anaconda 的笔记本电脑 如何拥有与协作功能类似的功能 让我可以简单地让我
  • 如何获得N个总和等于M的随机整数

    我想制作一个由 N 个随机整数组成的列表 其总和等于 M 个数字 我在Python中使用了numpy和dirichlet函数 但是这会生成双随机数数组 我想生成整数随机数 import numpy as np np random diric
  • 如何最好地使用 php 和 mysql 从分数表中获取某人的“排名”而不循环

    我的桌子上有乐谱和缩写 但桌子不会被订购 我可以很容易地获得总行数 并且我知道我可以获取所有行数和排序依据 然后循环遍历它们并以这种方式获得排名 但还有更好的办法吗 这可以通过 SQL 语句来完成吗 我不太关心性能 所以如果 SQL 语句是
  • 广告的 HTML 元素?

    网络上是否有关于为广告横幅选择哪种 HTML 元素的权威信息 我考虑过
  • 该浏览器无法识别 React Three Fiber 网格标签

    我正在关注 Youtube 上的 3d 作品集教程 但遇到了这个错误 在这里 我尝试渲染网格 但控制台显示警告 此元素在此浏览器中无法识别 浏览器正在渲染其余部分 但这部分代码没有被渲染 这是代码块 const Computers gt c
  • 如何在 C# 中模拟没有接口和虚方法的类?

    我正在为别人的代码编写单元测试 但我不允许修改这些代码 假设我有 class BadClass public BadClass the service isn t going to be running during testing it