【问题标题】:Exception is not being thrown or test method is not recognizing the thrown exception?没有抛出异常或测试方法无法识别抛出的异常?
【发布时间】:2021-04-22 00:12:34
【问题描述】:

[这是Taxi类的uml图。还有另一个类名“Rank”,这就是为什么我将属性“rank”设置为具有名为“Rank”的类的变量。]​​

我有这个测试方法:

[TestMethod]
public void _07_SetRankToNullThrowsException()
{ 
    Taxi t = new Taxi(1);
    Assert.ThrowsException<Exception>(() => t.rank = null);
}

如果“rank”为空,我应该抛出一个异常,这在这段代码中可以清楚地看到,但测试资源管理器无法识别抛出的异常,或者只是没有抛出异常:

public string rank { 
    get { return rank; }
   
    set
    {

        if (rank == null)
        {
            throw new Exception("Rank cannot be null");
        }
        else 
        {
            rank = null;
        }
        
    } 
    }

在 UML 图中,我应该让属性“rank”具有一个名为“Rank.cs”的类的变量(下面的代码)我也尝试过运行此代码,但它也没有不要抛出异常。:

public Rank rank { 
    get { return rank; }
   
    set
    {

        if (rank == null)
        {
            throw new Exception("Rank cannot be null");
        }
        else 
        {
            rank = null;
        }
        
    } 
}

【问题讨论】:

  • 能分享一下Taxi的构造函数吗? IE,是 Taxi(1) 设置等级吗?还有什么是等级?是类还是结构?结构是值类型,永远不能为空。
  • 对不起,这两个等级让我感到困惑。对于第一个,你确定你没有编译错误吗? C# 区分大小写。 'rank' 和 'Rank' 不是相同的项目名称。但是在您的示例代码中,您有public string rank { get { return rank; }}。这不应该编译,或者如果编译,它应该导致无限循环异常,因为这就是你所拥有的。也许您的意思是public string Rank { get { return rank; }},其中“Rank”是属性名称,“rank”是支持该属性的私有变量。
  • 最后一条评论:所以我创建了一个带有public string rank { get { return rank; }} 的类的新项目。它确实可以编译,但是一旦我尝试访问该属性,我就会得到一个 StackOverFlowException。
  • if (rank == null) 应该是if (value == null)
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA license 授予 SE 分发内容的不可撤销权利(即无论您未来的选择如何)。根据 SE 政策,分发非破坏版本。因此,任何破坏行为都将被撤销。请参阅:How does deleting work? …。如果允许删除,则帖子下方左侧有一个“删除”按钮,但仅在浏览器中,而不是移动应用程序中。

标签: c# unit-testing exception


【解决方案1】:

在我看来,部分问题可能在于命名 - 您有一个名为 rank 的属性,您可以在其中访问该属性本身以发现它的价值。

在属性设置器中,使用关键字value 访问传入值(被设置的值)。您可以使用它来确定传入的值是否为null

您还需要有一个支持字段来存储您尚未显示的属性值。通常,支持字段是私有的并且是camelCase,而关联的属性是PascalCase。这种差异在这种情况下很有帮助,因为我们可以从Rank 访问rank

这样的事情应该可以解决问题:

// Backing field to store the value for the 'Rank' property
private string rank = string.Empty;  // It could technically be set to 'null' here :)

public string Rank 
{ 
    get { return rank; }
   
    set
    {
        if (value == null)
        {
            throw new Exception("Rank cannot be null");
        }
        else if (rank != value)
        {
            rank = value;
        }
    } 
}

【讨论】:

    【解决方案2】:

    因为您是在自己的 getter 中访问您的属性,所以它本身会永远循环。如果您添加代码以写入控制台,您可以看到这一点 -

    public Rank rank { 
        get 
        { 
             Console.WriteLine("uh oh"); //Here
             return rank; 
        }
       
        set
        {
    
            if (rank == null)
            {
                throw new Exception("Rank cannot be null");
            }
            else 
            {
                rank = null;
            }
            
        } 
    }
    

    你会看到大量的这些内容被写出来。您需要使用不同的名称和不同的变量作为此属性的支持字段。

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 2013-02-15
      • 2020-12-21
      • 2014-01-05
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多