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:帮助编写可测试类 的相关文章

随机推荐

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

    我有以下情况 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 应用程序有单元测试 但它们很脆弱 耦合性强 需要太多维护 并且被放弃了 我是来学