我看到很多开发人员都在编写单元测试:
[TestMethod]
public void AddTrainer_InvokesProviderAddTrainer()
{
//ARRANGE
var trainerBusiness = new TrainersBusiness(_trainerProviderMock.Object);
//ACT
trainerBusiness.AddTrainer(new UserProfile());
//ASSERT
_trainerProviderMock.Verify(v => v.AddTrainer(It.IsAny<UserProfile>()), Times.Once);
}
我明白发生了什么,我不知道这打算解决什么问题。这里的测试证明业务对象中的AddTrainer
方法正在调用提供程序中的AddTrainer
方法。
只要正确添加了培训师,对我来说,业务方法的重要性在于什么?对我来说,这意味着如果我们决定改变业务方法在未来添加培训师的方式,即使仍然添加了培训师,这个单元测试也会失败,我们必须重写它。
在我看来,这种类型的测试只是确认没有人改变你的方法,有点像校验和,而不是确认对行为有用的任何东西。
我错过了什么?
答案 0 :(得分:1)
这是为了确保没有人使用TrainersBusiness.AddTrainer
方法混淆,因为添加了一些阻止UserProfile
添加到TrainerProvider
答案 1 :(得分:1)
你经常在无效返回方法的单元测试中看到这个,因为人们不知道要断言什么。有时这是一个好主意,有时它只是为了获得高代码覆盖率。我认为你的例子属于代码覆盖范围。我的关键是&#34; It.IsAny&#34;用法结合测试方法的名称。作者可以将其命名为AddTrainer_GetCodeCoverage。如果您有2个名为AddTrainer_ValidTrainer_InvokesProviderAddTrainer和AddTrainer_InvalidTrainer_ThrowsSpecificExeception的测试,每个测试都对Mock进行不同的检查并确认传递给模拟的值,那么您就有了一些有价值的东西。