如何使用内部构造函数和静态工厂方法来模拟类?

2023-12-24

我有课我的服务这取决于ABC服务(Nuget包/sdk)

public class MyService
{
   private readonly ABCService _abc;

   public MyService(ABCService abc)
   {
      this._abc = abc;
   }

   public async Task Run(string id) 
   {
      // some logic
      var result = await this._abc.DoSomething(id);
      // some logic
   }
}

ABCService 看起来像这样:

public class ABCService 
{
   internal ABCService(string someConnectionString, object someSettings)
   {
      // ... initialization
   }

   public static CreateFromConnectionString(string someConnectionString, object someSettings)
   {
      // some logic
      return new ABCService(someConnectionString, someSettings);
   }
}

这种方式模拟类将不起作用并引发异常。 “父级没有默认构造函数。”

var mock = new Mock<ABCService>();
var myService = new MyService(mock.Object);

我应该如何处理这个问题?有没有办法模拟这样的课程?

我唯一想到的是创建接口 IABCService ,然后将其注入到 MyService 的构造函数中

public class IABCService 
{
   Task DoSomething(string id);
}

public class MyService
{
   private readonly IABCService _abc;

   public MyService(IABCService abc)
   {
      this._abc = abc;
   }
}

然后我可以这样做:

var mock = new Mock<IABCService>();
var myService = new MyService(mock.Object);

流行的隔离框架如 Moq、NSubstitute 或 FakeItEasy 是受约束的。它们只能替代虚拟方法。要使用它们,您必须使用界面,正如您已经猜到的那样。这是轻松维护松散耦合和可测试性的推荐方法。

有一堆不受约束的模拟框架:TypeMock Isolator、JustMock、Microsoft Fakes(这三个都是付费的)和免费开源 Prig、Pose、Shimmy、Harmony、AutoFake、Ionad.Fody、MethodRedirect。它们允许模拟非虚拟成员,包括私有成员、静态成员等。
其中一些可以让您创造奇迹,但您不应该太过于使用它们,因为最终它可能会导致糟糕的架构。

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

如何使用内部构造函数和静态工厂方法来模拟类? 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • app.yaml 上的错误处理程序

    如何处理应用程序引擎上的不同错误代码 在我的 app yaml 文件中 我有 error handlers file error notfound html error code over quota file error over quo
  • 移动赋值运算符上的异常说明符如何影响移动构造函数的异常说明符?

    我一直在 C 14 模式下使用 GCC 5 2 和 clang 3 6 进行测试 它们给出相同的输出 对于以下代码 include
  • Web API 和 EF 导致 InvalidOperationException

    我的解决方案中有 3 个项目 DataModel EF DAL 它与 DataModel 和 MVC Web API 中的实体一起使用 只有 2 个非常简单的实体 Person Address 每个实体都有 3 个简单字段 Person 具
  • iphone CLLocationmanager 区域监控回调未触发

    我正在尝试使用监控区域来跟踪用户是否访问过地标 位置管理器与地图套件一起在视图控制器中初始化 在视图控制器的 viewDidLoad 中 if self locationManager nil NSLog creating location
  • C++ 中变量、方法等的良好命名约定是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Websphere Liberty:JMS 会话不起作用

    我正在将 EJB 应用程序从 websphere 9 0 迁移到 Liberty 我正在使用应用程序服务器迁移实用程序来帮助我进行迁移 列出的问题之一是 移植的本地事务 JMS 会话在 Liberty 中不起作用 我查看了帮助中提到的详细信
  • 如何强制 jQuery“监听”未来的 AngularJS ng-repeat 元素并激活插件?

    对 jQuery 有相当的经验 对 AngularJS 很陌生 我有一个页面 其中包含颜色列表 可变数字 并附有 jQuery 颜色选择器 由类 colorpicker 标记 在 PHP 生成的静态页面版本上 效果很好 但是将其转换为 ng
  • 使用 vanilla JS 突出显示活动选项卡

    我正在创建一个选项卡式导航栏 其中当选项卡处于活动状态时 它应该将其颜色更改为我设置的颜色 使用选项卡浏览页面效果很好 但活动选项卡上的颜色突出显示似乎不起作用 到目前为止 这是我的代码 HTML section class tab sec
  • Jenkins 构建时的 java.nio.file.AccessDeniedException

    我正在 MacOSX 服务器上设置 Jenkins 系统 以便在 svn 签入后自动构建 但是当构建开始时 我在控制台输出中收到这些 java 错误 有谁有詹金斯和这些错误的经验吗 Gestartet durch Benutzer anon
  • 在 Java 中创建一个新线程的成本有多高?我们什么时候应该考虑使用线程池?

    我想知道应该使用线程池的界限在哪里 在不使用线程池的情况下 每秒可以创建多少个新线程 仍然可以避免明显的性能损失 是否有任何可观察的开源线程池实现 考虑到成本 唯一有效的答复是亲自测试它 不是那么优雅的方式告诉你我从未做过这样的测试 也永远
  • 保存和恢复事件处理程序

    我的类包含数据集 TDataSet 我的班级的用户可以为此数据集分配事件处理程序 ds FieldByName ID OnChange ID OnChange 然后我必须重新打开数据集 ds Close ds Open 之后所有事件处理程序
  • C# 中的枚举有成员数量限制吗?

    我想知道枚举结构类型对其成员是否有限制 我有一个非常大的 变量 列表 我需要将其存储在枚举中或作为类中的常量 但我最终决定将它们存储在类中 但是 我对成员的限制有点好奇枚举 如果有 那么 枚举在 Net 上有限制吗 是的 会员人数具有独特的
  • Typescript - 为类成员设置默认值

    我有一个简单的模型 export class Profile extends ServerData name string email string age number 当我调用服务器 Angular 4 http 时 我经常得到以下响应
  • 在 Ruby 中按数组中对象的值排序

    我的数组中有一堆对象 想按每个对象具有的值进行排序 每个对象中的相关属性都是一个数值 例如 1 bunch of other stuff 5 12 3 会成为 1 bunch of other stuff 3 5 12 我想按每个对象中存储
  • 如何将大小相等的正方形网格减少到最小的矩形集?

    如果我有一个由相同大小的正方形组成的任意大小的网格 它们之间没有间距 我需要知道一种有效的方法将它们减少为minimum矩形的数量 例如 如果每个星号代表一个正方形 那么这可以减少为一个大矩形 虽然这可以减少为两个矩形 gt 1 2 一个明
  • 如何检查 Android 应用是否是设备所有者?

    我正在使用机器人框架执行一个测试用例 我必须安装一个应用程序并将其设置为设备所有者 然后检查同一应用程序是否已成为设备所有者 我已经搜索了 Stack Overflow 和其他搜索引擎结果 但在那里 他们提到了如何使应用程序成为设备所有者
  • 更改 LibGDX 中的坐标系 (Java)

    LibGDX 有一个坐标系 其中 0 0 位于左下角 就像这张图片 https i stack imgur com jVrJ0 png https i stack imgur com jVrJ0 png 这让我头撞墙 主要是因为我正在移植一
  • 带有片段参数的 Grails render()

    有没有办法将 render 与片段参数一起使用 以便在页面加载时自动滚动到页面的特定部分 类似于我们如何调用 redirect controller book action show fragment profile 你不能将它传递给ren
  • Webpack:html-loader 无法解析 srcset 图像

    我正在使用 webpack2 并使用 html loader 如下配置所示 test html loader html loader options attrs img src img srcset minimize true caseSe
  • 如何使用内部构造函数和静态工厂方法来模拟类?

    我有课我的服务这取决于ABC服务 Nuget包 sdk public class MyService private readonly ABCService abc public MyService ABCService abc this