[这里是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;
}
}
}
答案 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;
}
}
}
你会看到大量的这些被写出来。您需要使用不同的名称和不同的变量作为此属性的支持字段。