C# 使用NUnit测试自定义异常

C# 使用NUnit测试自定义异常,c#,exception,nunit,C#,Exception,Nunit,使用NUnit测试自定义异常时遇到问题。作为背景,我正在构建一个简单的机场计划来改进C#,这是我最近开始学习的。如果有暴风雨或机场满员,飞机就不能在机场降落。有关守则摘录: 摘录自机场等级,但有例外: public void Land(Plane plane) { try { if (weather.Forecast() == "stormy") {

使用NUnit测试自定义异常时遇到问题。作为背景,我正在构建一个简单的机场计划来改进C#,这是我最近开始学习的。如果有暴风雨或机场满员,飞机就不能在机场降落。有关守则摘录:

摘录自机场等级,但有例外:

 public void Land(Plane plane)
        {
            try
            {
                if (weather.Forecast() == "stormy")
                {
                    throw new StormyException("It's too stormy to land");
                }
                if (planes.Count >= _Capacity)
                {
                    throw new CapacityException("Airport is full");
                }
                planes.Add(plane);
                Console.WriteLine($"{ plane.Name } has landed at {_AirportName}");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
例外情况本身的示例:

   class StormyException : Exception
    {

        public StormyException(string message)
           : base(String.Format(message))
        {

        }

    }
失败测试的示例:

   [Test]

        public void PlaneWontLandIfStormy()
        {
            var weather = new Mock<Weather>();
            weather.Setup(x => x.Forecast()).Returns("stormy");
            var airport = new Airport("TestAirport", weather.Object, 10);
            var exception = Assert.Throws<Exception>(() => airport.Land(plane));
            Assert.AreEqual(exception.Message, "It's too stormy to land");
        }
[测试]
公共空间飞机云图风暴()
{
var weather=新模拟();
weather.Setup(x=>x.Forecast()).Returns(“暴风雪”);
var机场=新机场(“测试机场”,weather.Object,10);
var exception=Assert.Throws(()=>airport.Land(plane));
AreEqual(exception.Message,“暴风雨太大,无法降落”);
}

当我运行程序时,一切正常。但是,此测试未通过,并出现以下错误:
预期值:但为:null
。我已经对此进行了研究,并看到了
[ExpectedException]
的语法。。。但我似乎无法解决这个问题。我对C#很陌生,所以非常感谢您的帮助,谢谢

您的
Land
方法需要抛出异常,而不是捕获它

public void Land(Plane plane)
{
    if (weather.Forecast() == "stormy")
    {
        throw new StormyException("It's too stormy to land");
    }
    if (planes.Count >= _Capacity)
    {
        throw new CapacityException("Airport is full");
    }
    planes.Add(plane);
    Console.WriteLine($"{ plane.Name } has landed at {_AirportName}");
}

在您的测试中

var exception=Assert.Throws(()=>airport.Land(plane)); AreEqual(exception.Message,“暴风雨太大,无法降落”)

var exception=Assert.Throws(()=>airport.Land(plane));
例外.Message.Equals(“暴风雨太大,无法降落”)

异常处理是我最讨厌的一件事,你在处理异常时遇到了一些严重的问题。我希望这只是为了测试,但为了安全起见,我会将我最喜欢的两篇文章链接起来,解释如何正确操作:|您正在使用异常,因此除了该方法之外没有什么可捕捉的。谢谢@Christopher-我将阅读这些文章。哦,不:(我认为我在处理异常方面做得很好-你能详细说明什么是严重的问题吗?(不需要详细说明-我会阅读文章-只是想知道什么会立即跳到你身上如此糟糕?)@jordantomiko我经常链接这些文章,因为这些都是初学者常见的错误。我看到的最大错误是“catch(Exception ex)”-你将catch设置为wide。接下来是
Console.WriteLine(ex.Message)
-您只公开了消息。@Christopher感谢您花时间解释这一点并分享文章-作为C#初学者,非常感谢。我在这里主要使用它们来练习错误处理语法,因此这非常有用。(老实说,如果我是“在现实生活中”编写此程序的话)我不会在这种情况下抛出异常,因为它们不是真正的“异常”)