我正在尝试使用 Moq 从 LLBLGen 的IDataAccessAdapter接口模拟扩展方法。这是FetchQueryAsync扩展方法。
这样做给了我无法模拟静态扩展方法的错误。但是,我无法更改代码。所以我尝试创建一个包装类,但我也没有成功,因为我不知道如何应用它。
在 Fetch 方法中,我希望 FetchQueryAsync 返回我在测试期间指定的对象,而不是实际执行查询。
public class QueryHandler
{
private IDataAccessAdapterProvider dataAccessAdapterProvider;
public QueryHandler(IDataAccessAdapterProvider provider)
{
this.dataAccessAdapterProvider = provider;
}
private async Task<T> Fetch(DynamicQuery<T> query)
{
using (IDataAccessAdapter adapter = dataAccessAdapterProvider.Provide()
{
result = await adapter.FetchQueryAsync(query)
}
}
}
public class DataAccessAdapterProvider : IDataAccessAdapterProvider
{
public IDataAccessAdapter Provide()
{
var adapter = new DataAccessAdapter();
return adapter;
}
}
所以在我的单元测试中我有这个:
List<int> il = new List<int>();
Mock<IDataAccessAdapterProvider> mock = new Mock<IDataAccessAdapterProvider>();
mock.Setup(m => m.Provide()
.FetchQueryAsync<int>(It.IsAny<DynamicQuery<int>>()))
.ReturnsAsync(il);
但是,这不起作用,因为它不受支持。所以我试着把这个方法包装起来。
interface IWrap
{
Task<List<TElement>> FetchQueryAsync<TElement>(IDataAccessAdapter adapter, DynamicQuery<TElement> query);
}
public class Wrap : IWrap
{
public async Task<List<TElement>> FetchQueryAsync<TElement>(IDataAccessAdapter adapter, DynamicQuery<TElement> query)
{
return await adapter.FetchQueryAsync(query);
}
}
我如何将此包装器与 Moq 一起应用来模拟界面?