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