我无法从 BLL/服务层运行单元测试。该测试模拟工作单元,因为它是服务方法的单元测试。因此,uow 模拟具有空存储库属性,该属性无法通过单元测试。
单元测试初始化
[TestInitialize]
public void TestInitialize()
{
ServiceCollection.AddSingleton<IUploadFilesService, UploadFilesService>();
// Mocks
var uploadFilesRepositoryMock = new Mock<UploadFilesRepository>();
uowMock = new Mock<IUnitOfWork>();
uowMock.SetupGet(el => el.UploadFilesRepository).Returns(uploadFilesRepositoryMock.Object);
// errors here because interface has no setter
// Register services
ServiceCollection.AddSingleton(uowMock.Object);
BuildServiceProvider();
service = (UploadFilesService)ServiceProvider.GetService<IUploadFilesService>();
}
为了安全起见,该接口仅具有吸气剂,并且可能应该保持这种状态。
public interface IUnitOfWork : IDisposable
{
IUploadFilesRepository UploadFilesRepository { get; }
int Complete();
}
上传文件服务
void SetStatus()
{
unitOfWork.UploadFilesRepository.SetStatus(files, status);
}
错误:UploadFilesRepository 为空。
我尝试以多种方式实例化存储库:
// Mocks
var uploadFilesRepositoryMock = new Mock<UploadFilesRepositoryMock>();
uowMock = new Mock<UnitOfWork>(null, uploadFilesRepositoryMock );
// Register services
ServiceCollection.AddSingleton(uowMock.Object);
ServiceCollection.AddSingleton
出错。
Message=Can not instantiate proxy of class: Repositories.UnitOfWork.
Could not find a constructor that would match given arguments:...
uowMock = new Mock<IUnitOfWork>(null, uploadFilesRepositoryMock);
错误:
Constructor arguments cannot be passed for interface mocks.
uow.SetupGet()
。System.ArgumentException
HResult=0x80070057
Message=Can not instantiate proxy of class:
Could not find a parameterless constructor. (Parameter 'constructorArguments')
我搜索了有关这些单元测试错误的其他问题,但它们没有解决我使用依赖注入 AddSingleton 方法的情况。为了保持一致性,我在 [TestInitialize] 中的所有测试中使用它以获得更清晰的代码格式。
看来我可以仅使用
Setup
来设置 UoW 模拟和 getter 方法,并且它是这样工作的。
var uploadFilesQueueRepositoryMock = new Mock<IUploadFilesQueueRepository>();
uowMock = new Mock<IUnitOfWork>();
uowMock.Setup(m => m.UploadFilesQueueRepository).Returns(uploadFilesQueueRepositoryMock.Object);
我尝试了SetupGet()、模拟具体类、AddSingleton,但解决方案只是使用Setup()方法。