c# - 尝试测试任务时 Moq 出现异常

标签 c# .net unit-testing testing moq

我正在尝试在异步调用中使用 Moq (4.10),但我无法掌握它。

搜索如何执行此操作并找到我已尝试但无法正常工作的答案。

这是我的测试

 public class Test
 {
        [Fact]
        public void Test_Create()
        {
            var repositoryMock = new Mock<IRepository>();

            repositoryMock
             .Setup(repo => repo.CreateAsync(It.IsAny<Aggregate >()))
             .Returns(Task.CompletedTask); 
/// also tried this 
/// => .Returns(Task.FromResult(default(object))) 
/// and 
/// => .Returns(Task.FromResult(false))); 

            var useCase = new CreateUseCase(repositoryMock.Object);

            Task.Run(async () => { await useCase.HandleAsync(new CreateRequest()); });

            repositoryMock.VerifyAll();
        }
}

资源

How can I tell Moq to return a Task?

获取这个异常

Moq.MockException: 'The following setups on mock 'Mock<.Repository.IRepository:00000001>' were not matched: IRepository repo => repo.CreateAsync(It.IsAny < Aggregate>())

repo 看起来像这样

public interface IRepository 
{
    Task CreateAsync(Aggregate aggregate);
}

用例

    public class CreateUseCase : IUseCaseHandler<CreatRequest>
    {

        private IRepository _repository;


        public CreateUseCase (IRepository repository)
        {
            _repository= repository?? throw new System.ArgumentNullException(nameof(repository));
        }


         public async Task HandleAsync(CreateRequest request, CancellationToken? cancellationToken = null)
         {
              Aggregate aggregate = new Aggregate();
                        aggregate.Create();
              await _repository.CreateAsync(aggregate);
          } 
     }

存储库

 public sealed class OrderRepository : ProxyRepository<OrderAggregate>, IOrderRepository
    {
        public OrderRepository(IUnitOfWork unitOfWork, INotificationDispatcher eventHandler) 
            : base(unitOfWork, eventHandler)
        {
        }

        async Task IRepository.CreateAsync(Aggregate aggregate)
        {
            await base.AddAsync(aggregate); 
        }
    }

我做错了什么或遗漏了什么?

最佳答案

我们通常不必模拟不返回任何接口(interface)的方法,除非我在您的问题中遗漏了某些内容。

public class CreateUseCaseTests
{
    [Fact]
    public async Task HandleAsync_ShouldCreateRequest()
    {
        // Arrange
        var repositoryMock = new Mock<IRepository>();    
        var sut = new CreateUseCase(repositoryMock.Object);

        // Act
        await sut.HandleAsync(new CreateRequest());

        // Assert
        repositoryMock.Verify(x => x.CreateAsync(It.IsAny<Aggregate>()), Times.Once);
    }
}

关于c# - 尝试测试任务时 Moq 出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53174267/

相关文章:

.net - JSON.NET:将 JSON 对象的一部分反序列化为字典

.net - WPF 在 TextBox 中混合绑定(bind)和固定文本

.net - Entity Framework 4.0 在插入前自动截断/修剪字符串

c# - 构建操作页面或资源

javascript - Google 饼图未在浏览器中显示

ios - 在 iOS 中使用 OCMock 测试 void 方法

c# - 单元测试删除,即使在数据库中删除了记录也返回

python - 使用pytest测试同一类的不同实例

c# - 在 C# 中对同一结果进行多个断言的最佳实践

c# - 覆盖 getter 和 setter 的替代方法