在我的.Net6 Web应用程序中,我try 为单个IWordRepository
接口的两个实现注册服务注入:
-
WordRepositoryInMemory
,处理内存中的数据; -
WordRepositoryDatabase
个,用于调用数据库;
按照this article中的示例,我创建了一个枚举:
public enum WordRepositoryImplementation
{
WordRepositoryInMemory,
WordRepositoryDatabase
}
然后,在我的Program.cs
美元里,我注册了这两项服务:
builder.Services.AddScoped<WordRepositoryDatabase>();
builder.Services.AddScoped<WordRepositoryInMemory>();
builder.Services.AddTransient<Func<WordRepositoryImplementation, IWordRepository?>>(wordRepositoryProvider => key =>
{
return key switch
{
WordRepositoryImplementation.WordRepositoryInMemory => wordRepositoryProvider.GetService<WordRepositoryInMemory>(),
WordRepositoryImplementation.WordRepositoryDatabase => wordRepositoryProvider.GetService<WordRepositoryDatabase>(),
_ => null,
};
});
然后,我在控制器中调用它,如下所示:
private readonly IWordRepository _wordRepositoryDatabase; // I only require one of the implementations to be called by this controller.
public DictionaryDataController(Func<WordRepositoryImplementation, IWordRepository> serviceResolver)
{
_wordRepositoryDatabase = serviceResolver(WordRepositoryImplementation.WordRepositoryDatabase);
}
不幸的是,这增加了复杂性,搞砸了我对控制器的测试.我不再能够使用WordRepositoryDatabase
服务中的简单Mock.Object来实例化sut.说不能,我的意思是,我还没有处理代表所需的经验.
在我的测试装置中,我try 替换服务的原始模拟实现:
private Mock<IWordRepository> _wordRepository;
// ....
_wordRepository= new Mock<IWordRepository>();
// ....
DictionaryDataController sut = new(_wordRepositoryDatabase.Object);
设置为返回IWordRepository
的Mock的值,以便我可以在构造函数中使用它:
private Func<WordRepositoryImplementation, IWordRepository?> _funcWordRepositoryImplementation;
// ...
// ...
DictionaryDataController sut = new(_funcWordRepositoryImplementation);
然而,我在这里无法掌握所需的语法.我最接近的是一个返回Mock.Object的无参数Func<;>;(),但它显然遗漏了一些东西.
_funcWordRepositoryImplementation= () =>
{
return new Mock<WordRepositoryImplementation, IWordRepository>();
};
而试图将一些参数传递给它导致了他们自己的一系列错误.
What would the correct way to set up this field be?个