模拟单元测试行为。为什么验证方法调用有益?

时间:2014-09-03 12:01:48

标签: unit-testing mocking

我看到很多开发人员都在编写单元测试:

[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方法。

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

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

我错过了什么?

2 个答案:

答案 0 :(得分:1)

这是为了确保没有人使用TrainersBusiness.AddTrainer方法混淆,因为添加了一些阻止UserProfile添加到TrainerProvider

的条件

答案 1 :(得分:1)

你经常在无效返回方法的单元测试中看到这个,因为人们不知道要断言什么。有时这是一个好主意,有时它只是为了获得高代码覆盖率。我认为你的例子属于代码覆盖范围。我的关键是&#34; It.IsAny&#34;用法结合测试方法的名称。作者可以将其命名为AddTrainer_GetCodeCoverage。如果您有2个名为AddTrainer_ValidTrainer_InvokesProviderAddTrainer和AddTrainer_InvalidTrainer_ThrowsSpecificExeception的测试,每个测试都对Mock进行不同的检查并确认传递给模拟的值,那么您就有了一些有价值的东西。