单元测试检查空值

时间:2012-09-15 20:59:18

标签: unit-testing mstest

这是一个非常基本的问题,但我仍然找不到合适的答案。在我的测试中,有可能有空值,因此最后阶段(Act)开始看起来有点奇怪(它不再仅仅是行为)。我的意思是:

Assert.IsNotNull(variable);

var newVariable = variable.Property;
Assert.IsNotNull(newVariable);

var finalVariable = newVariable.AnotherProperty;
Assert.AreEqual(3, finalVariable.Count);

现在它们显然是相关的,我必须确保这些值不是null,而且在一次测试中有三个断言,并且act部分开始看起来不正确。

那么这种情况下的一般解决方案是什么?有没有比3个测试更聪明的东西,每个断言一个,并在最后2个断言之前检查为空?

4 个答案:

答案 0 :(得分:1)

基本上有两种方法可以解决您的问题:

  1. Guard assertions:额外声明确保数据在正确测试之前处于已知状态(这就是您现在正在做的事情)。
  2. 保护断言移至他们自己的测试中。
  3. 选择哪个选项很大程度上取决于测试中的代码。如果先决条件在其他测试中重复,则它提示单独的测试方法。如果前提条件在生产代码中有反映,那么它再次提示单独的测试方法。

    另一方面,如果它只是为了增强你的信心而做的事情,也许单独的测试太多了(但正如其他答案所述,这可能表明你不在完全控制你的测试或你一次测试太多东西。

答案 1 :(得分:0)

我认为您应该将此测试分成三个测试,并根据发生的情况对其进行命名。即使您在这些测试中的行为相同,您也可以通过检查方法的返回值来测试不同的方案,这是非常明智的。

答案 2 :(得分:0)

Nulls是皇室的痛苦。问题是,它们能合法存在吗?

让我们将讨论与代码和测试分开。

如果null不存在,那么代码本身而不是测试应该检查并验证它们不是null。出于这个原因,我的代码的每个方法都是使用一个检查参数的片段构建的:

    public VideoPosition(FrameRate theFrameRate, TimeSpan theAirTime)
    {

        Logger.LogMethod("theVideoMovie", theFrameRate, "theAirTime", theAirTime);
        try
        {
            #region VerifyInputs

            Validator.Verify(theFrameRate);
            Validator.Verify(theAirTime);
            Validator.VerifyTrue(theAirTime.Ticks >= 0, "theAirTime.Ticks >= 0");

如果null在代码中是合法的,但是您正在测试返回值不应为null的场景,那么您当然必须在测试代码中验证这一点。

答案 3 :(得分:0)

在单元测试中,您应该能够控制所测试类的每个输入。这意味着您可以控制变量是否具有值。

所以你会有一个单元测试强制你的变量为null,然后断言。

然后你将进行另一个测试,你可以确定你的变量有一个值,你甚至需要其他的断言。

我前段时间写了一篇博客。也许它可以提供帮助:Unit Testing, hell or heaven?