Unit testing 单元测试检查空值

Unit testing 单元测试检查空值,unit-testing,mstest,Unit Testing,Mstest,这是一个非常基本的问题,但我仍然找不到合适的答案。在我的测试中,有可能有空值,因此最后一个阶段(Act)开始看起来有点奇怪(它不再只是Act)。我的意思是: Assert.IsNotNull(variable); var newVariable = variable.Property; Assert.IsNotNull(newVariable); var finalVariable = newVariable.AnotherProperty; Assert.AreEqual(3, final

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

Assert.IsNotNull(variable);

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

var finalVariable = newVariable.AnotherProperty;
Assert.AreEqual(3, finalVariable.Count);
现在它们显然是相关的,我必须确保这些值不是空的,但是在一个测试中有三个断言,并且act部分开始看起来不正确


那么,在这种情况下,一般的解决方案是什么?还有什么比3个测试(每个测试有一个断言)更聪明的方法吗?在最后2个断言之前检查null?

我认为您应该将此测试分为三个测试,并根据发生的情况相应地命名它们。即使您在这些测试中的行为是相同的,您也可以通过检查该方法的返回值来测试不同的场景。

空值是非常有用的。问题是,它们能合法存在吗

让我们将讨论分为代码和测试

如果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的场景,那么您当然必须在测试代码中验证这一点。

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

因此,您将有一个单元测试,强制您的变量为null,然后断言这一点

然后,您将进行另一个测试,您可以确保您的变量有一个值,并且您只需要其他断言


不久前我写了一篇关于这个的博客。也许它会有帮助:

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

  • :额外断言确保数据在正确测试发生之前处于已知状态(这就是您现在正在做的)
  • 将保护断言移动到它们自己的测试中
  • 选择哪个选项在很大程度上取决于测试中的代码。若前提条件在其他测试中重复,那个么这是对单独测试方法的提示。若前提条件在生产代码中有反映,那个么它再次提示使用单独的测试方法

    另一方面,如果只是为了增强自信而做的事情,那么单独测试可能太多了(但正如其他答案中所指出的,这可能是一个迹象,表明你没有完全控制自己的测试,或者一次测试的内容太多了)