如何在 C# 中对嵌套的 "using" 语句进行单元测试?
How to do unit testing for nested "using" statements in C#?
我正在处理大型遗留项目。
我已经开始使用 xUnit 编写单元测试。
另外,我正在使用 Moq 框架。
我在这里阅读了很多文章,但没有找到明确的答案。我坚持理解如何在测试方法中模拟两个 IDisposable 对象?我想测试的方法:
public class SomeService: ISomeService
{
...
public async Task<Settings> GetSettings(UserIdentity user)
{
SettingsDBModel dbModel;
using (DBHelperAsync dbHelper = new DBHelperAsync(user))
{
using (DBHelperReaderAsync reader = await dbHelper.ExecuteReader("Stored procedure Name", new { UserID = user.UserID }))
{
dbModel = await reader.GetResult<SettingsDBModel>();
}
}
var settings = new Settings(dbModel);
return settings;
}
...
}
我想要 reader.GetResult()
方法 returns 一些假数据。有没有想过应该如何实现 DBHelperAsync 和 DBHelperReaderAsync 对象的模拟?
测试中的 class 应该重构以将其与 DBHelperAsync
实现问题分离。 类 应该依赖于抽象而不是具体化.
应该为 运行 时间码相应地注入和配置抽象显式依赖项。现在将允许被测 class 足够灵活,以便轻松地进行隔离测试。 (显式依赖原则)。
如果遗留 classes 无法修改,则应将它们包装在可以修改的抽象中,然后注入到正在测试的 classes 中。
上面提供的代码需要一个 IDBHelperAsyncFactory
抽象,它将被注入 class 并用于创建一次性 DBHelperAsync
,它也应该从一次性抽象派生 interface IDBHelperAsync : IDisposable
.
这将使这些抽象在测试时很容易 mocked/stubbed。
我正在处理大型遗留项目。 我已经开始使用 xUnit 编写单元测试。 另外,我正在使用 Moq 框架。 我在这里阅读了很多文章,但没有找到明确的答案。我坚持理解如何在测试方法中模拟两个 IDisposable 对象?我想测试的方法:
public class SomeService: ISomeService
{
...
public async Task<Settings> GetSettings(UserIdentity user)
{
SettingsDBModel dbModel;
using (DBHelperAsync dbHelper = new DBHelperAsync(user))
{
using (DBHelperReaderAsync reader = await dbHelper.ExecuteReader("Stored procedure Name", new { UserID = user.UserID }))
{
dbModel = await reader.GetResult<SettingsDBModel>();
}
}
var settings = new Settings(dbModel);
return settings;
}
...
}
我想要 reader.GetResult()
方法 returns 一些假数据。有没有想过应该如何实现 DBHelperAsync 和 DBHelperReaderAsync 对象的模拟?
测试中的 class 应该重构以将其与 DBHelperAsync
实现问题分离。 类 应该依赖于抽象而不是具体化.
应该为 运行 时间码相应地注入和配置抽象显式依赖项。现在将允许被测 class 足够灵活,以便轻松地进行隔离测试。 (显式依赖原则)。
如果遗留 classes 无法修改,则应将它们包装在可以修改的抽象中,然后注入到正在测试的 classes 中。
上面提供的代码需要一个 IDBHelperAsyncFactory
抽象,它将被注入 class 并用于创建一次性 DBHelperAsync
,它也应该从一次性抽象派生 interface IDBHelperAsync : IDisposable
.
这将使这些抽象在测试时很容易 mocked/stubbed。