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

鲁斯兰·波罗沃克(Ruslan Borovok)

我正在处理大型遗留项目。我已经开始使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章