单元测试:ViewResult为空的原因,为什么值得测试?

时间:2014-04-08 21:24:02

标签: c# unit-testing asp.net-mvc-5

提到null ViewResults的其他问题实际上似乎是指null模型(我肯定计划测试的东西)。我是测试新手。刚开始我的第一个使用TDD的项目。我发现的一些资源,甚至是新MVC项目的库存测试代码,都显示了对ViewResult进行null测试:

// Stock code
[TestMethod]
public void Index()
{
    // Arrange
    HomeController controller = new HomeController();

    // Act
    ViewResult result = controller.Index() as ViewResult;

    // Assert
    Assert.IsNotNull(result);
}

我想知道为什么这是必要的。鉴于我的经验有限,我只能想到为什么ViewResult为null的两个原因:

原因1:您返回了错误的类型,如JsonResult或其他东西 - 如果该方法返回一般ActionResult,则可以执行此操作。我可以看出这是一个合理的原因,但我不确定这是一个要求我的方法需要专门返回一个ViewResult。事实上,也许我希望它在未来很容易改变。

原因2:您显式返回null。但在现实世界中,你为什么要那样做?

有人可以提供ViewResult何时为null的其他示例,并解释为什么(或为什么不)测试它很重要?正如我所说,我的经历是有限的,因此可能会有一些我没有看到的东西 - 这就是我要问的原因。



修改
如果我把问题格式化得不好,请道歉。让我澄清一下:如果它为空,我理解它是坏的,并且如果空值可能/可能,则理解测试null 的值。我更关心的是A. 如何/为什么它首先是无效的,以及B.这些原因是否是合法的原因会增加测试价值,或者它们是否有优势在现实世界中不太可能发生的情况。

我的理由1和理由2是否涵盖了所有情景?如果没有,其他人在那里?如果它们是边缘情况,极不可能发生,你还在测试它们吗?

3 个答案:

答案 0 :(得分:3)

  

有人可以提供ViewResult何时为空的其他示例

永远不会成为null,这就是此测试用例验证的内容。如果开发人员以某种方式返回null而在控制器代码中引入了一个错误,那么这个测试用例会失败并且在错误代码投入生产之前会有很多生命。

答案 1 :(得分:2)

我们针对控制器操作编写的几乎所有测试都确保返回的ActionResult(无论是ViewResult,RedirectResult等)检查以确保它不为null。这与确保它不是null并且更多地与后续断言有关。例如,让我们说你的测试看起来像这样。

[TestMethod]
public void Index()
{
    HomeController controller = new HomeController();

    ViewResult result = controller.Index() as ViewResult;

    Assert.IsNotNull( result.Model );
}

如果以某种方式,当您尝试取消引用它以获取Model属性时,结果为null,则会抛出NullReferenceException。您的测试将失败,但它会因抛出异常而失败。现在开发人员必须弄清楚什么引用为null。对我们而言,当您尝试使用返回的结果时,它确实是一种确保您在代码中不会遇到难以调试的失败的方法。

答案 2 :(得分:2)

整个测试点是双重的。在进行测试驱动开发时,它们会推动您的代码开发。您编写了一个测试,断言返回的视图不为null。此测试最初失败,直到您编写满足它的代码。

第二步是在代码更改时发出警告,并返回null。

从现在起2年后,您可能会更改方法以添加意外导致空返回的更复杂逻辑。你想马上赶上它。