如何编写使用return关键字的单元测试用例?

时间:2018-12-29 10:06:53

标签: c# unit-testing

我正在为我的班级编写单元测试用例,并且我有一个需要编写单元测试的场景。

 public void CheckModelDetail(ProductModel model)
 {
       if (executeTemodel == null)
       {
            return;
       }

       checkModel();
 }

因此,我不确定如何检查return语句。

2 个答案:

答案 0 :(得分:3)

一个可能的解决方案是模拟类,用CheckModelDetail调用null并验证从未调用过checkModel。例如,使用Moq

var mock = new Mock<MyClass> { CallBase = true };
mock.CheckModelDetail(null);
mock.Verify(m => m.checkModel(), Times.Never());

答案 1 :(得分:2)

这里的流行语(有大量文献)是可观察到的效果。通常它是状态更改,返回值或引发(或不引发)的异常。

例如,如果您要测试未引发异常(可观察到的效果),则无需在任何输出上断言:

public void ShouldNotThrowException()
{
    var objectUnderTest = new YourClass();
    objectUnderTest.CheckModelDetail(null);
}

尝试删除您的if (executeTemodel == null)子句,您将看到测试在checkModel中的某个地方失败(假定您在其中访问模型的成员)。任何未处理的异常都会使您的测试失败。

您可以使用ShouldlyShould.NotThrow使其更加明确:

public void ShouldNotThrowException()
{
    var objectUnderTest = new YourClass();
    Should.NotThrow(() => objectUnderTest.CheckModelDetail(null));
}

这不仅可以测试您的代码,而且对于任何阅读您的测试代码的人来说,都很清楚。

如果要断言未调用checkModel(),则应将此方法移到另一个类中并使用Mock(有关详细介绍,请参见Martin Fowler's TestDouble)。但是我不确定您是否以CheckModelDetail消费者的身份关心它。您应该测试您想发生的事情(即未抛出异常,模型被认为是有效的,模型被认为是无效的...),而不是其实现方式(即{通常不会调用{1}},因此只要接口不变,您就可以自由重构实现。