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_Exception Handling - Fatal编程技术网

C# 特定类型异常的单元测试

C# 特定类型异常的单元测试,c#,unit-testing,exception-handling,C#,Unit Testing,Exception Handling,在我开始我的问题之前先了解一下背景。我目前正在从事一个从IBMDB2迁移到SQLServer的项目。不想太详细,但这个DB2链接服务器有时会与SQL server断开连接,这对于链接服务器来说是正常的。我有这个工作的代码,并有一个过程设置为这照顾它 无论如何,我正在尝试编写一个测试方法,抛出一个DbException(链接服务器未连接时抛出的异常),以测试我在链接服务器断开连接时编写的进程。有没有办法强制抛出某种类型的异常,这样我就可以测试代码了 try-catch块如下所示: try {

在我开始我的问题之前先了解一下背景。我目前正在从事一个从IBMDB2迁移到SQLServer的项目。不想太详细,但这个DB2链接服务器有时会与SQL server断开连接,这对于链接服务器来说是正常的。我有这个工作的代码,并有一个过程设置为这照顾它

无论如何,我正在尝试编写一个测试方法,抛出一个DbException(链接服务器未连接时抛出的异常),以测试我在链接服务器断开连接时编写的进程。有没有办法强制抛出某种类型的异常,这样我就可以测试代码了

try-catch块如下所示:

try
{
    //Regular Processing and attempt to update to DB2
}
catch (DbException ex)
{
    //Other processing to catch a linked server issue
}
catch (Exception ex) 
{
    //Even more processing for other exceptions
}

您可以这样简单地抛出它:

throw new DbException();

这与大多数单元测试的方法相同,通过接口注入依赖项,将真正的db逻辑放在基于该接口的一个类中,然后 基于该接口在另一个系统中进行测试

interface  IDBProcessor
{
   void Process()
}

class ThrowyClass : IDBProcessor
{
    public Exception ThrowThis {get; set;}
    public void Process() 
    {
        throw ThrowThis;
    }
}


void MyMethod(IDBProcessor processor)
{
  try
  {
    processor.Process()
  }
  catch (DbException ex)
  {
    //Other processing to catch a linked server issue
  }
  catch (Exception ex) 
  {
    //Even more processing for other exceptions
  }
}
然后在单元测试中,创建一个包含所需异常的ThrowyClass并将其传入。(如果您愿意,可以使用模拟框架来避免创建测试类)


您必须根据您的特定应用程序自定义内容。您可能希望在“MyClass”的构造函数中插入IPProcessor

您应该查看
IDbConnection
并尝试
Moq
框架
您的代码应该如下所示

var dbConnectionMock = new Mock<IDbConnection>();
dbConnectionMock.Setup(x => x.Open())
                   .Callback(() => {
                           throw new SqlException();
                       }).Verifiable();
var dbConnectionMock=new Mock();
dbConnectionMock.Setup(x=>x.Open())
.Callback(()=>{
抛出新的SqlException();
}).可验证();

DbException
是一个抽象类。您必须创建一个可以从它派生的自定义异常类,然后抛出您的自定义类,或者抛出从
DbException
派生的任何现有类型,如
SqlException
。您是对的,我认为它只是一个从异常类继承的普通类
var dbConnectionMock = new Mock<IDbConnection>();
dbConnectionMock.Setup(x => x.Open())
                   .Callback(() => {
                           throw new SqlException();
                       }).Verifiable();