我正在为我的班级编写单元测试用例,并且我有一个需要编写单元测试的场景。
public void CheckModelDetail(ProductModel model)
{
if (executeTemodel == null)
{
return;
}
checkModel();
}
因此,我不确定如何检查return
语句。
答案 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
中的某个地方失败(假定您在其中访问模型的成员)。任何未处理的异常都会使您的测试失败。
您可以使用Shouldly的Should.NotThrow使其更加明确:
public void ShouldNotThrowException()
{
var objectUnderTest = new YourClass();
Should.NotThrow(() => objectUnderTest.CheckModelDetail(null));
}
这不仅可以测试您的代码,而且对于任何阅读您的测试代码的人来说,都很清楚。
如果要断言未调用checkModel()
,则应将此方法移到另一个类中并使用Mock(有关详细介绍,请参见Martin Fowler's TestDouble)。但是我不确定您是否以CheckModelDetail
的消费者的身份关心它。您应该测试您想发生的事情(即未抛出异常,模型被认为是有效的,模型被认为是无效的...),而不是其实现方式(即{通常不会调用{1}},因此只要接口不变,您就可以自由重构实现。