Вы начали с метода расширения, а затем создали интерфейс IWrap
вместе с реализацией, которая использует метод расширения. Это прекрасно.
Теперь все, что вам нужно, это добавить его в ваш класс, как IDataAccessAdapterProvider
уже введено:
public class QueryHandler
{
private readonly IDataAccessAdapterProvider _dataAccessAdapterProvider;
private readonly IWrap _wrap; //I'm assuming you'll want a different name.
public QueryHandler(IDataAccessAdapterProvider provider, IWrap wrap)
{
_dataAccessAdapterProvider = provider;
_wrap = wrap;
}
(Я применил общее соглашение. Префикс имени поля с подчеркиванием - _wrap
- означает, что аргументы поля и конструктора имеют разные имена, поэтому вам не нужно указывать this.wrap
. Плюс, когда люди видят это подчеркивание в другом месте, они будут знать, что это поле.)
Теперь вы можете смоделировать интерфейс:
var mock = new Mock<IWrap>();
var returnedFromMock = new List<int> { 1, 2, 3 };
mock.Setup(x => x.FetchQueryAsync<int>(It.IsAny<IDataAccessAdapter>(), It.IsAny<DynamicQuery<int>>()))
.ReturnsAsync(returnedFromMock);
Вы упомянули, что нет способа изменить код Я не уверен, какую часть вы не можете изменить, но если вы не можете изменить QueryHandler
, чтобы заменить его конкретные зависимости, то это может быть просто предостерегающим рассказом о статических зависимостях.
Хотя у вас есть исходный код. Если вы не можете изменить существующий класс, возможно, вы можете просто создать новый из существующего исходного кода. Если кто-то спросит, почему вы продублировали существующий класс, просто скажите (тактично), что вы не хотите дублировать код - вы скорее исправите существующий, чтобы его можно было проверить.