如何对嵌套“进行单元测试”;使用;C#中的语句?
我在处理大型遗留项目。 我已经开始用xUnit编写单元测试。 另外,我正在使用Moq框架。 我在这里读了很多文章,但没有找到一个明确的答案。我一直在理解如何在一个测试方法中对两个IDisposable对象进行模拟?我想测试的方法是:如何对嵌套“进行单元测试”;使用;C#中的语句?,c#,unit-testing,moq,xunit,C#,Unit Testing,Moq,Xunit,我在处理大型遗留项目。 我已经开始用xUnit编写单元测试。 另外,我正在使用Moq框架。 我在这里读了很多文章,但没有找到一个明确的答案。我一直在理解如何在一个测试方法中对两个IDisposable对象进行模拟?我想测试的方法是: 公共类SomeService:ISomeService { ... 公共异步任务GetSettings(用户标识用户) { 设置dbModel dbModel; 使用(DBHelperAsync dbHelper=new DBHelperAsync(用户)) { 使
公共类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
实现问题分离。应该为运行时代码注入并相应地配置抽象-显式依赖项。现在,将允许被测试的类具有足够的灵活性,可以轻松地进行隔离测试。