TDD:帮助编写可测试类

2024-01-11

我有一个快速的小应用程序,想尝试使用 TDD 进行开发。我从未使用过 TDD,实际上甚至不知道它是什么,直到我发现 ASP.NET-MVC。 (我的第一个 MVC 应用程序有单元测试,但它们很脆弱,耦合性强,需要太多维护,并且被放弃了——我是来学习单元测试的!= TDD)。

应用程序背景:

我有一个以字符串形式读入的采购订单的文本转储。我需要解析文本并返回新的采购订单编号、新的行项目编号、旧的采购订单编号、旧的采购订单行编号。很简单。

现在我只处理新的采购订单详细信息(编号/行)并拥有如下模型:

public class PurchaseOrder
{
    public string NewNumber {get; private set;}
    public string NewLine {get; private set;}

    new public PurchaseOrder(string purchaseOrderText)
    {
        NewNumber = GetNewNumber(purchaseOrderText);
        NewLine = GetNewLine(purchaseOrderText);
    }

    // ... definition of GetNewNumber / GetNewLine ...
    //  both return null if they can't parse the text
}

现在我想添加一个方法“IsValid”,仅当“NewNumber”和“NewLine”均为非空时该方法才应为 true。所以我想测试一下:

public void Purchase_Order_Is_Valid_When_New_Purchase_Order_Number_And_Line_Number_Are_Not_Null()
{
    PurchaseOrder order = new PurchaseOrder()
    {
        NewNumber = "123456",
        NewLine = "001"
    };

    Assert.IsTrue(order.IsValid);
}

这很容易,但允许公共设置器和无参数构造函数似乎是一个糟糕的妥协。因此,另一种方法是在构造函数中输入“purchaseOrderText”值,但随后我也会测试“GetNewNumber”和“GetNewLine”的代码。

我对如何将其编写为可测试类感到困惑,同时试图将其锁定在对模型有意义的方面。这似乎是一个常见问题,所以我想我只是错过了一个明显的概念。


一种解决方案是不让构造函数完成这项工作:

public class PurchaseOrder
{
    public PurchaseOrder(string newNumber, string newLine)
    {
        NewNumber = newNumber;
        NewLine = newLine;
    }
    // ...
}

那么测试就变得简单且隔离——你不是在测试GetNewNumber and GetNewLine同时。

为了帮助使用PurchaseOrder您可以创建一个将它们组合在一起的工厂方法:

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

TDD:帮助编写可测试类 的相关文章

  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • Coffeescript + 单元测试:全局变量?

    我正在尝试使用 Jasmine 对用 CoffeeScript 编写的小型应用程序进行单元测试 我发现很多资料都说单元测试可以在从 CoffeeScript 编译的 JS 上完美地完成 如果所有内容都包装在匿名函数中以避免污染名称空间 如何
  • 按成员序列化

    我已经实现了template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 另一个作业完成后重新创建作业

    我有以下情况 job1 和 job2 同时访问服务器 并且都返回状态401 这意味着我的令牌访问权限已过期 我需要进行刷新 我启动 job3 它返回了新令牌 在这种情况下 我必须根据请求使用新令牌重新创建 job1 和 job2 并启动它们
  • 算术运算导致溢出c#

    解锁文件时出现以下错误 算术运算导致溢出 系统 IntPtr ToInt32 我怀疑是下面一行pBuffer ToInt32 IntPtr iPtr new IntPtr pBuffer ToInt32 i Marshal SizeOf f
  • 手动控制 UIView 动画的进度,而不是在持续时间内自动控制

    我想设置一个 UIView 动画 但我想控制百分比进度并让它自动为我插入值 而不是花费给定的时间 那可能吗 谢谢 我想我已经明白了 紧接着 UIView animate 块之后 在根视图上执行以下操作 view layer speed 0
  • tm.getDeviceId() 已弃用?

    我得到了IMEI和设备 ID 所以我遇到了问题getDeviceId 已弃用 TelephonyManager tm TelephonyManager getSystemService this TELEPHONY SERVICE imei
  • 如何修复“运行错误:无法获取机器“boot2docker-vm”:机器不存在”?

    Running boot2docker与start info stop delete参数会导致错误消息 snowch boot2docker start error in run Failed to get machine boot2doc
  • 在一种条件下检查 NaN、null 和 >=0

    我有一个 var a 其值可以是NaN null and any ve ve number including 0 我需要一个条件来过滤掉 a 的所有值 这样只有 gt 0 值才能在 if 条件下产生 true 实现这一目标的最佳方法是什么
  • 如何将 OpenID 添加到 php 站点?

    我非常喜欢 StackOverflow 使用 OpenID 进行注册 我该如何将其添加到我的网站中 它是基于 PHP 的 我访问了 openid net 并查看了那里的库 但几乎找不到文档或示例 本教程对我之前使用 PHP 和 OpenID
  • 我可以在不符合 PCI 要求的情况下存储用户银行详细信息吗?

    我们正在开发一个项目 其性质在某种程度上是乘车共享 我读到了有关 PCI 合规性的内容 我知道如果我们处理信用卡或付款 我们必须符合 PCI 合规性 我有点模棱两可 我们是否存储司机的银行信息 例如帐号 加密 数据库中的帐户名称等 我已阅读
  • 浮点不准确示例

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 您如何向仍然认为计算机无限聪明和准确的新程序员和外行解释浮点不准确 您是否有一个最喜欢的例子或
  • 如何获得 Elixir 的可靠跳转定义?

    我尝试了 Jet Brains 的 Elixir 插件 以及 VS Code 的两个插件 但到目前为止 它们都没有可靠地引导我定义函数和模块 显然部分原因是因为 Elixir lsp 无法处理内部的事情scope块 https github
  • 如何在Android Studio中包含*.so库?

    我读了很多线程如何将 so 库添加到 Android Studio 但它们都不起作用 特别是当涉及到文本时 This does not work with the new xxx Android Studio gradle 我们可以重新开始
  • 使用ggplot绘制趋势线

    我使用 ggplot2 根据我的数据绘制趋势线 以下是我使用电子表格所做的事情 但我只想显示趋势线 如上图所示的黑线 而不是所有点 因为观察数量 gt 20 000 所以我尝试使用 ggplot2 做同样的事情 fig a lt ggplo
  • 如何将 xml 的嵌套层次结构转换为 sql 表

    使用 MSSQL 2008 和 XQUERY 考虑存储在表中的以下 XML
  • 您请求的商品无法购买

    我正在尝试将 Android Market 应用内购买集成到我的应用中 但不幸的是 每次我尝试购买真正的应用内产品时都会遇到恼人的错误 我已获取示例应用程序 Dungeons 并将其添加到我的应用程序中 我已更新公钥并将产品列表更新为以下内
  • SendGrid Automated Security 如何处理 SPF 记录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用 SendGrid 并且有 2 个专用 IP 我的网站使用 SendGrid 发送电子邮件 我同时使用 G Suite 并且我个人使
  • WPF RichTextBox - 在当前插入符位置获取整个单词

    我在 WPF Richtextbox 上启用了拼写功能 并且希望在显示带有拼写建议的上下文菜单之前获取当前插入符号位置处拼写错误的单词 新方式 void richTextBox1 PreviewKeyDown object sender K
  • 将外部项目添加到 subversion 存储库 [重复]

    这个问题在这里已经有答案了 我希望我的 SVN 存储库具有以下结构 External MVC MVCConttrib NLog 我希望每个团队成员都能够查看外部存储库 这样就没有人需要查找底层项目的 SVN URL 但我希望存储库中的项目从
  • 从 webview 播放视频时如何设置横向方向

    我有一个带有视频链接的网络视图 该应用程序只是纵向方向 但当视频处于全屏状态并使用所有屏幕时 我需要更改方向 感谢您的帮助 把这个放在你的AppDelegate UIInterfaceOrientationMask application
  • 临时对象是 xvalue 吗?

    我目前正在撰写学位论文 其中还涉及对 C 11 背后理论的一些解释 这确实很好 因为 C 是我选择的编程语言 并且该标准或多或少是免费提供的 N3337 让您迷失方向在 然而 当我试图准确而详细地解释新的 xvalue 类别时 我遇到了困难
  • TDD:帮助编写可测试类

    我有一个快速的小应用程序 想尝试使用 TDD 进行开发 我从未使用过 TDD 实际上甚至不知道它是什么 直到我发现 ASP NET MVC 我的第一个 MVC 应用程序有单元测试 但它们很脆弱 耦合性强 需要太多维护 并且被放弃了 我是来学