如何避免单元测试中不必要的前提条件?

苏达

理想情况下,为生产代码中的每个类编写一个测试类。在测试类中,所有测试方法可能不需要相同的前提条件。我们如何解决这个问题?我们是否为此创建单独的测试类?

公里

我建议创建单独的方法来包装必要的前提条件设置不要将这种方法与传统的测试设置混淆例如,假设您为收据提供者编写了测试,该提供者将搜索存储库并根据某些验证步骤返回收据。我们可能最终得到:

  • 仓库中不存在收据:返回null
  • 收据存在,但与验证者日期不符:返回null
  • 收据存在,与验证者日期匹配,但未完全提交(即未由某些外部系统处理):返回null

这里有几个条件:收据存在/不存在,收据按日期无效,未提交收据。我们的满意之路是默认设置(例如通过传统的测试设置完成)。然后,快乐路径测试将像(一些C#伪代码)一样简单:

[Test]
public void GetReceipt_ReturnsReceipt()
{
    receiptProvider.GetReceipt("701").IsNotNull();
}

现在,对于特殊情况,我们只需编写微小的专用方法即可安排我们的测试环境(例如,安装依赖项),以便满足条件:

[Test]
public void GetReceipt_ReturnsNull_WhenReceiptDoesntExist()
{
    ReceiptDoesNotExistInRepository("701")
    receiptProvider.GetReceipt("701").IsNull();
}

[Test]
public void GetReceipt_ReturnsNull_WhenExistingReceiptHasInvalidDate()
{
    ReceiptHasInvalidDate("701");
    receiptProvider.GetReceipt("701").IsNull();
}

您最终将获得一些额外的辅助方法,但是您的测试将更容易阅读和理解。当逻辑比简单的“是/否”设置复杂时,这特别有用:

[Test]
public void GetReceipt_ThrowsException_WhenUncommittedReceiptHasInvalidDate()
{
    ReceiptHasInvalidDate("701");
    ReceiptIsUncommitted("701");
    receiptProvider.GetReceipt("701").Throws<Exception>();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

方法前提条件是否应该进行单元测试?

来自分类Dev

如何测试是否被排除的前提条件?

来自分类Dev

最新的前提条件测试?

来自分类Dev

使用断言测试前提条件

来自分类Dev

如何在Xcode中调试“前提条件失败”?

来自分类Dev

前提条件

来自分类Dev

PHPDoc前提条件

来自分类Dev

类型的前提条件?

来自分类Dev

PHPDoc前提条件

来自分类Dev

类型的前提条件?

来自分类Dev

使用前提条件测试Swift代码

来自分类Dev

为什么在基于属性的测试中忽略了我的前提条件?

来自分类Dev

如何禁用Clojure断言,包括前提条件?

来自分类Dev

如何使用Bootstrap模态检查前提条件?

来自分类Dev

如何记录(简单)Java方法的前提条件?

来自分类Dev

如何禁用Clojure断言,包括前提条件?

来自分类Dev

如何使用Bootstrap模态检查前提条件?

来自分类Dev

如何为唯一索引添加前提条件?

来自分类Dev

如何在 yield call(..) 之前检查前提条件

来自分类Dev

验证android中的函数前提条件

来自分类Dev

Makefile前提条件中的目标名称

来自分类Dev

Makefile前提条件中的目标名称

来自分类Dev

在模式规则中定义前提条件的选择

来自分类Dev

如何避免R中不必要的for循环

来自分类Dev

如何避免在React中不必要的重新渲染?

来自分类Dev

如何避免不必要的数据复制?

来自分类Dev

js如何避免不必要的点击

来自分类Dev

每次执行前提条件

来自分类Dev

dafny前提条件失败