5

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

Assert.IsNotNull(variable);

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

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

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

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

4

4 回答 4

1

基本上有两种方法可以处理您的问题:

  1. Guard assertions:额外的断言确保数据在正确的测试发生之前处于已知状态(这就是你现在正在做的事情)。
  2. 守卫断言转移到他们自己的测试中。

选择哪个选项很大程度上取决于被测代码。如果先决条件会在其他测试中重复,这是单独测试方法的提示。如果前提条件在生产代码中有所反映,则再次提示单独的测试方法。

另一方面,如果这只是您为了增强信心而做的事情,那么单独的测试可能太多了(但正如其他答案中所述,这可能表明您无法完全控制您的测试,或者您一次重新测试太多东西)。

于 2012-09-15T22:49:28.397 回答
0

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

于 2012-09-15T21:09:12.497 回答
0

无效是皇家的痛苦。问题是,它们可以合法存在吗?

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

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

于 2012-09-15T21:10:07.303 回答
0

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

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

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

我前段时间写了一篇关于这个的博客。也许它可以提供帮助:单元测试,地狱还是天堂?

于 2012-09-15T21:11:29.860 回答