1

我看到许多开发人员编写这样的单元测试:

[测试方法]公共void AddTrainer_InvokesProviderAddTrainer(){//安排var trainerBusiness=新培训师业务(_trainerProviderMock.Object);//ACT公司培训师业务。AddTrainer(新UserProfile());//资产负债表_培训供应商模拟。验证(v=>v.AddTrainer(It.IsAny<UserProfile>()),次数。一次);}

我理解正在发生的事情,只是不太清楚这将解决什么问题。这里的测试证明添加培训师业务对象中的方法正在调用添加培训师方法。

只要正确添加了培训师,业务方法如何进行对我来说有什么重要性?对我来说,这意味着如果我们决定改变未来业务方法增加培训师的方式,即使培训师仍在增加,但单元测试失败,我们必须重写它。

在我看来,这种类型的测试只是确认没有人更改您的方法,有点像校验和,而不是确认任何有用的行为。

我错过了什么?

6
  • @乔治:这是一个关于一种常见做法的问题,一开始似乎并不直观,我不明白为什么要关闭它。 评论 2014年9月3日14:03
  • @JeroenVannevel问题的内容不是问题;问题是问题的写法,“重点是什么?”“为什么我在乎?”“我为什么要给猴子怎么做?”这导致了争论模式,而不是“可以解决的问题”模式。 评论 2014年9月3日14:05
  • 当然,更不用说关于堆栈溢出有很多问题:google.com/… 评论 2014年9月3日14:06
  • 我稍微改变了措辞。这可能已经结束了,但根本的问题是“从单元测试的角度来看,这一验证告诉了我什么”,这是一个值得问的问题。如果是重复的,那当然是一个很好的理由,但就目前来看,我认为这个问题是可以回答的。 评论 2014年9月3日14:09
  • @乔治:我搜索了前面的问题,但他们似乎只是假设测试行为是一件好事。我找不到为什么测试“如何实现”会在测试“已实现”的基础上增加好处
    – 西蒙N
    评论 2014年9月3日15:18

2个答案2

重置为默认值
1

您在void返回方法的单元测试中经常会看到这种情况,因为人们不知道要断言什么。有时这是一个好主意,有时只是为了获得高代码覆盖率。我认为您的示例属于代码覆盖范围。对我来说,关键是“It.IsAny”用法与测试方法的名称相结合。作者可以将其命名为AddTrainer_GetCodeCoverage。如果你有两个名为AddTrainer_ValidTrainer_InvokesProviderAddTrainer和AddTrainer_ValidTrainer_SthrowsSpecificExeception的测试,每个测试都对模拟进行不同的检查,并确认传递给模拟的值,那么你就有了价值。

1
  • 谢谢。最后一句话对我来说很有意义。我可以看到在不同的情况下测试代码的正确路径的好处。
    – 西蒙N
    评论 2014年9月3日14:50
1

这是为了确保没有人乱搞培训师业务。添加培训师通过添加一些条件来防止用户配置文件从添加到培训师提供商

  • 但如果他们真的把它搞砸了,让教练以其他方式加入进来,不是吗?这里的测试不应该是添加了培训师,而不是如何添加的吗?
    – 西蒙N
    评论 2014年9月3日15:12
  • 假设UserProfile的属性为IsExternal,并且如果需要阻止添加一个只有非管理员用户添加的配置文件,且该标记设置为true,那么对于管理员来说,这应该是允许的。现在,如果有人实现了这个逻辑来检查AddTrainer方法中的IsExternal,这将是一个错误,通过这个测试可以检测到它 评论 2014年9月4日3:01
  • 啊,抓住你了。因此,该测试有助于强制执行该方法的单一责任。
    – 西蒙N
    评论 2014年9月5日7:33

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.