如何对嵌套“进行单元测试”;使用;C#中的语句?

如何对嵌套“进行单元测试”;使用;C#中的语句?,c#,unit-testing,moq,xunit,C#,Unit Testing,Moq,Xunit,我在处理大型遗留项目。 我已经开始用xUnit编写单元测试。 另外,我正在使用Moq框架。 我在这里读了很多文章,但没有找到一个明确的答案。我一直在理解如何在一个测试方法中对两个IDisposable对象进行模拟?我想测试的方法是: 公共类SomeService:ISomeService { ... 公共异步任务GetSettings(用户标识用户) { 设置dbModel dbModel; 使用(DBHelperAsync dbHelper=new DBHelperAsync(用户)) { 使

我在处理大型遗留项目。 我已经开始用xUnit编写单元测试。 另外,我正在使用Moq框架。 我在这里读了很多文章,但没有找到一个明确的答案。我一直在理解如何在一个测试方法中对两个IDisposable对象进行模拟?我想测试的方法是:

公共类SomeService:ISomeService
{
...
公共异步任务GetSettings(用户标识用户)
{
设置dbModel dbModel;
使用(DBHelperAsync dbHelper=new DBHelperAsync(用户))
{
使用(DBHelperReaderAsync reader=wait dbHelper.ExecuteReader(“存储过程名称,new{UserID=user.UserID}))
{
dbModel=await reader.GetResult();
}
}
var设置=新设置(dbModel);
返回设置;
}
...
}

我想
reader.GetResult()
方法返回一些假数据。有没有想过应该如何实现DBHelperAsync和DBHelperReaderAsync对象的mock?

应该重构测试中的类,以将其与
DBHelperAsync
实现问题解耦。类应该依赖于抽象,而不是具体化

应该为运行时代码注入并相应地配置抽象-显式依赖项。现在,将允许被测试的类具有足够的灵活性,可以轻松地进行隔离测试。(明确依赖原则)

如果遗留类不能被修改,那么它们应该被包装在可以修改的抽象中,然后注入到被测试的类中

上面提供的代码需要一个
IDBHelperAsyncFactory
抽象,该抽象将被注入类中,并用于创建一次性
DBHelperAsync
,它也应该从一次性抽象
接口IDBHelperAsync:IDisposable
派生


这将使这些抽象在测试时很容易被模仿/打断。

FWIW,这里不需要额外的大括号/缩进。你需要注入
DBHelperAsync
@juharr,实际上OP不应该注入
dbHelper
本身,因为方法应该是它的所有者/处置者,而不是方法的客户端或DI。因此,类需要注入一个
DBHelperFactory
,该方法可以使用它创建自己的新鲜
dbhelperSync
实例。然后可以模拟工厂方法以返回模拟的
DBHelperAsync
.I second@GoodNightNerdPride方法。要注入的工厂抽象将创建可丢弃的依赖项应重构被测试的类,以将其与
DBHelperAsync
实现问题分离。应该为运行时代码注入并相应地配置抽象-显式依赖项。现在,将允许被测试的类具有足够的灵活性,可以轻松地进行隔离测试。