我做了重構,如果我們的倉庫工廠,使之更加通用的,現在建立資料庫的方法看起來像這樣:嘲諷通用倉庫工廠方法
public TRepository CreateRepository<TRepository>(params object[] parameters)
where TRepository : class
{
if (_serviceProvider == null)
throw new ArgumentNullException(nameof(_serviceProvider));
return ActivatorUtilities.CreateInstance<TRepository>(_serviceProvider, parameters);
}
在我的生產代碼,我使用它像這樣和它的作品般的魅力:
_concreteRepo = repoFactory.CreateRepository<ConcreteRepo>();
但是,當我試圖重構單元測試,以及我遇到困難建立工廠,這是我要做的事,但它不工作。
public class Tests
{
// Since I am using Moq I can't mock anything but abstract types thus having problems with type conversion in set up.
protected readonly Mock<IConcreteRepository> _concreteRepositoryMock = new Mock<IConcreteRepository>();
protected readonly Mock<IRepositoryFactory> _factoryMock = new Mock<IRepositoryFactory>();
[SetUp]
public void SetUp()
{
// If I don't cast concreteRepositoryMock compiler complains that cannot convert from abstract to concrete repository.
// If I cast it fails and returns null.
_factoryMock.Setup(f => f.CreateRepository<ConcreteRepository>())
.Returns(_concreteRepositoryMock.Object as ConcreteRepository);
}
}
任何想法如何解決它?看起來像我的CreateRepository
方法返回具體類型,但嘲笑我不能嘲笑我的具體存儲庫。我也無法將抽象類型傳遞到CreateRepository
,因爲CreateInstance
需要具體類型。
不直接相關,但在前5行代碼中存在Factory,存儲庫,通用性,參數數組和ServiceProvider可能是過度工程的標誌。 – guillaume31