工作单元在单元测试中具有空存储库属性

问题描述 投票:0回答:1

我无法从 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 为空。

我尝试以多种方式实例化存储库:

  1. 模拟具体类而不是接口。
// 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:...
  1. 将构造函数参数传递给接口模拟。
    uowMock = new Mock<IUnitOfWork>(null, uploadFilesRepositoryMock);

错误:

Constructor arguments cannot be passed for interface mocks.
  1. 使用
    uow.SetupGet()

    错误:
System.ArgumentException
  HResult=0x80070057
  Message=Can not instantiate proxy of class: 
Could not find a parameterless constructor. (Parameter 'constructorArguments')

我搜索了有关这些单元测试错误的其他问题,但它们没有解决我使用依赖注入 AddSingleton 方法的情况。为了保持一致性,我在 [TestInitialize] 中的所有测试中使用它以获得更清晰的代码格式。

.net unit-testing dependency-injection moq unit-of-work
1个回答
0
投票

看来我可以仅使用

Setup
来设置 UoW 模拟和 getter 方法,并且它是这样工作的。

var uploadFilesQueueRepositoryMock = new Mock<IUploadFilesQueueRepository>();
uowMock = new Mock<IUnitOfWork>();
uowMock.Setup(m => m.UploadFilesQueueRepository).Returns(uploadFilesQueueRepositoryMock.Object);

我尝试了SetupGet()、模拟具体类、AddSingleton,但解决方案只是使用Setup()方法。

© www.soinside.com 2019 - 2024. All rights reserved.