我正在处理大型遗留项目。我已经开始使用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()
方法返回一些假数据。有没有想到应该如何为DBHelperAsync和DBHelperReaderAsync对象实现模拟?
应该重构被测类,以使其与DBHelperAsync
实现关注点分离。类应该依赖抽象而不是具体。
应该为运行时代码注入和配置相应的抽象显式依赖项。现在,这将使被测类具有足够的灵活性,以使其易于单独进行测试。(显式依赖原理)。
如果遗留类无法修改,则应将其包装成可以修改的抽象,然后将其注入被测类中。
上面提供的代码需要一个IDBHelperAsyncFactory
抽象,该抽象将被注入到类中并用于创建一次性对象DBHelperAsync
,该对象也应该从一次性抽象派生interface IDBHelperAsync : IDisposable
。
这样可以在测试时轻松地对这些抽象进行模拟/存根。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句