未抛出异常或测试方法无法识别抛出的异常?

时间:2021-04-22 00:12:34

标签: c# unit-testing exception

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

1

我有这个测试方法:

[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;
        }
        
    } 
}

2 个答案:

答案 0 :(得分: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;
        }
    } 
}

答案 1 :(得分:0)

因为你是在它自己的 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;
        }
        
    } 
}

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