Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我想断言在某个类中引发了异常_C#_Unit Testing - Fatal编程技术网

C# 我想断言在某个类中引发了异常

C# 我想断言在某个类中引发了异常,c#,unit-testing,C#,Unit Testing,我正在为我的客户机/服务器设置构建一个测试项目。我想验证测试是否在某个执行块内失败(没有要发送到的客户端,因此服务器的send()方法将引发异常)。因为我不想让测试启动客户机和服务器并让它们进行通信(我在一台机器上进行测试时遇到了问题) 如果代码到达这一行,这意味着程序的执行流只能在另一个测试的责任范围内失败。除了对抛出的异常的stacktrace执行子字符串检查之外,还有更简单的方法吗?我觉得这个方法的可扩展性不强,如果类名发生变化,就需要经常注意 是否有一种方法不需要手动检查异常的堆栈跟踪?

我正在为我的客户机/服务器设置构建一个测试项目。我想验证测试是否在某个执行块内失败(没有要发送到的客户端,因此服务器的send()方法将引发异常)。因为我不想让测试启动客户机和服务器并让它们进行通信(我在一台机器上进行测试时遇到了问题)

如果代码到达这一行,这意味着程序的执行流只能在另一个测试的责任范围内失败。除了对抛出的异常的stacktrace执行子字符串检查之外,还有更简单的方法吗?我觉得这个方法的可扩展性不强,如果类名发生变化,就需要经常注意


是否有一种方法不需要手动检查异常的堆栈跟踪?

如果您使用NUnit

不使用数据注释

[Test]
public void Test_XXXXXXX
{
    var yourClass = new YourClass(); 
    Assert.That(()=>yourClass.Method(),
                    .Throws.Exception
                    .TypeOf<TypeOfYourException>
                    .With.Property("Message")
                    .EqualTo("the message you are expecting goes here")
               );
}
[Test]
[ExpectedException(typeof(ExceptionType), ExpectedMessage="your message goes here!")]
public void Test_XXXXXXX
{
      var yourClass = new YourClass();     
      // Call your method in a way that it will fail
      yourClass.YourMethod();
}

这个类中的异常除了特定于那个类之外,还有什么独特之处吗

如果消息可以识别它,您可以按照其他答案所示进行测试,如果您不使用NUnit,也可以这样测试:

try {    
   myMethod();
   Assert.Fail("Expected exception to be thrown."); 

} catch (MyException ex) {    
   Assert.Equals("My Exception Message", ex.Message, "Exception message was formatted incorrectly.");

} catch (Exception) {    
   Assert.Fail("An exception was thrown, but of the wrong type.");    
}

当您对某个类进行单元测试时,有两个异常源:

  • 您正在测试的类可以引发异常
  • 类的依赖关系可能引发异常
  • 在第二种情况下,您通常要么处理异常,要么将其封装在更高级的异常中并将其抛出给调用方。那么,如何测试所有这些情况呢

    被测系统抛出异常

    例如,如果传递给方法(NUnit示例)的参数错误,则引发异常:


    正如您所看到的,我们也不关心异常的stacktrace,它会抛出我们的依赖项。它也可以是更低级异常的包装器。服务的预期行为-如果未找到配置,则引发高级初始化异常。我们正在验证该行为。

    检查是否引发异常是一个好主意。检查它是否是从特定方法中抛出的是一个坏主意。那就是测试一个实现细节。测试一个实现细节不是一个好主意-当你改变实现时会发生什么?@John Saunders:约翰,我认为测试一个实现细节是不是一个好主意取决于你在做什么。如果我开发了一个库(假设我实现了dictionary类),并且我的架构师告诉我,如果条目已经存在,他希望add方法有一个异常,那么我必须在单元测试中包含这个异常。另一方面,如果产品管理部门说,当用户名为空时,他们预期会出现错误,那么我是否会在模型类中使用异常或其他内容来管理该错误,将保留一个实现细节,并且可以更改。对于第二种情况,我同意你的看法。
    StockService service = new StockService();
    Assert.Throws<ArgumentNullException>(() => service.Connect(null));
    
    var configMock = new Mock<IStockServiceConfig>();
    configMock.Setup(c => c.Load()).Throws<FileNotFoundException>();
    
    StockService service = new StockService(configMock.Object);
    service.Connect("google");
    
    configMock.VerifyAll();
    Assert.That(service.Port, Is.EqualTo(80));
    
    var configMock = new Mock<IStockServiceConfig>();
    configMock.Setup(c => c.Load()).Throws<FileNotFoundException>();
    
    StockService service = new StockService(configMock.Object);
    Assert.Throws<StockServiceInitializationException>(_ => service.Connect("bing"));
    
    configMock.VerifyAll();