使用适配器模式包装系统对象(文件、服务控制器等)与绕道进行单元测试相比有哪些优点?

2024-02-10

考虑以下停止服务的方法:

Public Function StopService(ByVal serviceName As String, ByVal timeoutMilliseconds As Double) As Boolean

    Try
        Dim service As New ServiceController(serviceName)
        Dim timeout As TimeSpan = TimeSpan.FromMilliseconds(timeoutMilliseconds)

        service.[Stop]()

        If timeoutMilliseconds <= 0 Then
            service.WaitForStatus(ServiceControllerStatus.Stopped)
        Else
            service.WaitForStatus(ServiceControllerStatus.Stopped, timeout)
        End If

        Return service.Status = ServiceControllerStatus.Stopped

    Catch ex As Win32Exception
        'error occured when accessing a system API'
        Return False
    Catch ex As TimeoutException
        Return False
    End Try

End Function

为了对该方法进行单元测试,我基本上有两种选择:

  1. 使用适配器模式来包装ServiceController我需要将类的方法放入我可以控制的接口中。然后可以将该接口注入到服务类中(也称为控制反转)。这样我就有了松散耦合的代码,并且可以使用传统的模拟框架来测试。
  2. 保持类原样并使用 Microsoft Moles(或任何其他代码 绕行框架)拦截 的电话ServiceController到 返回测试结果 目的。

我同意,对于域模型代码,使用“传统”单元测试方法最有意义,因为这将导致最容易维护的设计。然而,对于处理 Windows API 相关内容(文件系统、服务等)的 .net 实现的代码,通过额外的工作来获取“传统”可测试代码真的有优势吗?

我很难看出使用 Microsoft Moles 进行以下操作的缺点ServiceController(或者File目的)。在这种情况下,我真的看不出采用传统方法有任何优势。我错过了什么吗?


顺便说一句,很好的问题..现在刚刚看了 MS Moles 视频。尽管我对 MS 单元测试工具持怀疑态度,但我必须说这个工具看起来很有趣。我的比较是:

适配器/外观

  • 优点:允许您通过意图揭示方法提取有意义的角色。例如ServiceManager.StartService(name)可以抽象细节{1. ServiceController.GetServices(), 2. 处理 ServiceController.Status != Stopped 的情况,3. ServiceController.Start()}。这里的模拟/假方法比设置 3 个代表需要更少的工作。这种方法是通过提出有意义的契约/接口来改进设计的机会(还允许您隐藏您不关心的东西——例如 Winapi 语义、常量等)
  • 优点:模拟框架将为您提供更好的参数检查诊断、调用次数、未调用的期望等。

拦截器

  • 优点:如果您只是感兴趣,则工作量会减少消除对依赖项的有问题的调用
  • 优点:在处理遗留代码时(对变化的恐惧是压倒性的),绝对是你工具箱中的一个好工具
  • 缺点:它有 MSTest 依赖性吗?初步搜索似乎表明,如果您不使用 MSTest,则需要一些插件或扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用适配器模式包装系统对象(文件、服务控制器等)与绕道进行单元测试相比有哪些优点? 的相关文章

  • dup2() 和 exec()

    include
  • 如果两个线程同时访问同一个 bool 变量会发生什么?

    我有一个跨平台 C 程序 其中使用 boost 库创建异步计时器 我有一个全局变量 bool receivedInput false 一个线程等待并处理输入 string argStr while 1 getline cin argStr
  • C# 测试活动的互联网连接。 Ping google.com

    C 2008 我正在使用此代码来测试互联网连接 因为我的应用程序必须登录到网络服务器 但是 如果用户互联网连接失败或电缆被拔出 我必须通知用户 Ping www google com to check if the user has a i
  • binary_log_types.h:没有这样的文件或目录

    我正在编译一个小型 mysql C 项目并且 遇到以下错误 C Program Files x86 MySQL MySQL Server 5 7 include mysql com h 22 30 fatal error binary lo
  • 为什么这个 oracle 批量插入不起作用?

    我正在尝试将一些数据批量插入到 oracle 数据库中 我按照文档中的示例进行操作 this DataBaseAccess new OracleConnection connString var dataAdapter new Oracle
  • & 运算符的含义是什么?

    在下面的代码中 Expression
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a
  • 如何从Web JavaScript应用程序获取桌面C#程序中的变量

    我遇到一个问题 有两个应用程序 一种是 C 中的桌面应用程序 另一种是 javascript 中的 Web 应用程序 运行桌面应用程序中的一些变量或信息需要传输到Web应用程序 有谁知道如何解决这个问题 有人愿意提供更多细节来解决这个问题吗
  • 修改正在运行的可执行文件的资源内容

    All 我将应用程序设置存储在资源中 当我的程序首次加载时 我使用 WinAPI 读取指定的资源 然后我解析检索到的字节数据 这对我来说完美无缺 现在假设用户更改了我的应用程序中的设置 他 她检查复选框控件 我想将更新的设置保存到我的资源中
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • 如何使用 ProtoGen 从 proto 文件生成结构

    我们一直在使用 protobuf net ProtoGen 从 proto 文件生成 C cs 文件 我们希望代替类来生成结构 例如 DataContract public struct Entity1 ProtoMember 1 publ
  • 为什么 httpRuntime targetFramework="4.5" 禁止抓取 .ASPXAUTH cookie?

    当我的 web config 具有以下 httpRuntime 时 我的控制器无法获取 cookie ASPXAUTH 它似乎能够获取任何其他 cookie 无论带或不带句点前缀 如果我删除下面的行 它就可以正常工作
  • C 中的链表数组:初始化和插入?

    我需要创建一个链表数组 如图所示 这就是我到目前为止所做的 typedef struct Node int data struct Node next Node int main void Node link 5 for int q 0 q
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • 如何在asp.net core 6中注入IConfiguration

    web api 应用程序中不再有 Startup cs 我们以前可以注入IConfiguration进入那个Startup class public class Startup public Startup IConfiguration c
  • 用于 nmap 输出的 C++ xml 解析器

    我是 nmap 的新手 我在 nmap 教程中看到 https nmap org book man output html https nmap org book man output html oX 选项可用于获取 xml 格式的 nma
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使

随机推荐

  • 如何在不禁用的情况下禁用用户触摸 UIbarbutton?

    我的工具栏中有一个 UiBarButton 项目 我需要停用用户触摸交互 UiBarButton 没有设置用户交互启用其财产 当我隐藏它时 没有适当的可见性 有人可以告诉我如何在不禁用 UIbarbutton 的情况下禁用它的用户触摸交互吗
  • 尝试在Python中制作JSON Schema验证器来设置默认值

    我正在使用稍微修改过的代码版本JSON 架构常见问题解答 http python jsonschema readthedocs io en latest faq why doesn t my schema that has a defaul
  • Datalog、CLIPS、Prolog

    和很多程序员一样 我在大学里学过 Prolog 但只学了很少的部分 我理解Prolog和Datalog密切相关 但是Datalog更简单 另外 我相信我读到 Datalog 不依赖于逻辑子句的顺序 但我不确定为什么这是优点 CLIPS 据说
  • 使用 VBA 在 PowerPoint 中设置对象的位置

    我使用以下 VBA 行来设置刚刚粘贴到 PowerPoint 中的 Excel 选区的大小 位置 Set Shp PPApp ActivePresentation Slides PPApp ActiveWindow Selection Sl
  • 返回空列表而不是 null

    我想更改当前函数以返回空 JSON 列表 当前它返回nil 这是我当前的代码 func s Service projectsGet c gin Context var projects models Project user getUser
  • 沿轴对张量进行火炬求和

    如何对张量的列求和 torch Size 10 100 gt torch Size 10 最简单和最好的解决方案是使用torch sum 对张量的所有元素求和 torch sum x gives back a scalar 对所有行 即每列
  • 使用 pyparsing 解析嵌套结构

    我正在尝试解析生物序列中位置的特定语法 职位可以采用以下形式 12 a simple position in the sequence 12 34 a complex position as a base 12 and offset 34
  • 递归 SQL 将 CSV 拆分为表行

    在解决了一个不同的问题后 我偶然发现了递归 CTE 从表面上看 这似乎是解决 将 csv 拆分为表行 问题的相当简单的方法 我把这个例子放在一起 DECLARE InputString varchar 255 a b c d e f g h
  • java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.ClassLoadingException

    我使用 spring junit 测试 但在所有测试中都收到此错误消息 因为我更新了 Hibernate Search Hibernate 和 Springframework 在 pom xml 中 我包含了来自 Hibernate 的 c
  • WPF 中某些情况下上下文菜单被剪切

    上下文菜单在不同的 NET Framework 中被截断 查看 ZIP 文件中的图像 有两张截图 一张来自 XP 另一张来自 Win7 我创建了一个简单的 Visual Studio 2010 解决方案来重现我的问题 http www me
  • 在 iOS 13 中连接到 NFCTagReaderSession NFCISO7816Tag 标签并发送命令

    我正在研究 iOS 13 中新提供的 NFCTagReaderSession 我突然连接了会话标签并发送 apdu 命令进行通信 当我调用 connect 属性时 在连接时 发出蜂鸣声 它看起来需要 15 秒才能连接 它会显示一条错误消息
  • Python嵌入

    我想要一个嵌入 Python 解释器和一个小脚本的大型二进制文件 我对整个静态链接 配置和制作以及 GCC 等完全陌生 请问 有人可以向我描述构建此类可执行文件的基本步骤吗 我使用的是 MacOS 10 6 我下载了 Python 3 3
  • Tensorflow 重塑张量

    我正在尝试使用tf nn sparse softmax cross entropy with logits我已遵循用户 Olivier Moindrot 此处 1 的回答 但出现尺寸错误 我正在构建一个分割网络 因此输入图像为 200x20
  • BLOB 如何存储在索引视图中?

    问题 假设我在包含以下内容的表上创建索引视图varbinary max 列 二进制内容是否会被物理复制到索引视图的 B 树中 或者原始字段是否会以某种方式 引用 而无需物理复制其内容 换句话说 如果我在包含 BLOB 的表上创建索引视图 是
  • 将日期时间转换为 24 小时格式

    我从服务器得到的时间就像Jul 27 2011 8 35 29 AM 我想将其转换为yyyy MM dd HH mm ss 我还希望转换后的时间采用 24 小时格式 任何人都可以解决这个问题 我想要得到的输出就像2011 07 27 08
  • 在 Mac OS X 上使用 libpng 编译 C 程序

    我有一个用 C 语言编写的使用 libpng 的小实用程序 在linux下 我只需安装libpng dev并执行 gcc myapp c usr lib libpng so o myapp 在 Mac OS X 中 我安装了 Xcode 工
  • Postgres 从左连接更新

    我是 PostgreSQL 的新手 正在尝试转换来自 SQL Server 的查询 我有一个用户表 其中包括 bUsrActive bUsrAdmin 和 sUsrClientCode 列 如果不存在具有相同 sUsrClientCode
  • 有没有快速的库可以在 Flash 中查找人的眼睛和嘴巴? (动作脚本)

    所以我有实时视频流 上面有 1 一 人 它是黑白的 我需要能够捕捉到这个人的眼睛和嘴巴 方向 至少X Y 状态 至少打开或关闭 那么在这种情况下 有没有快速的库可以在 Flash 中找到人的眼睛和嘴巴呢 纯 Actionscript 或 H
  • 使用 T-SQL 在时间序列数据中前向填充空值的有效方法

    我有一个包含时间序列数据的表 其中大部分为空值 我想用最后一个已知值填充所有空值 我有一些解决方案 但它们比同等的解决方案慢得多DataFrame fillna method ffill 在 Pandas 中进行操作 我正在使用的代码 数据
  • 使用适配器模式包装系统对象(文件、服务控制器等)与绕道进行单元测试相比有哪些优点?

    考虑以下停止服务的方法 Public Function StopService ByVal serviceName As String ByVal timeoutMilliseconds As Double As Boolean Try D