如何对基于 Clean Architecture 和 CQRS 的控制器进行单元测试?

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

我有一个产品 API,我打算通过 xUnit.net 和 Moq 对其进行单元测试。顺便说一句,我对单元测试完全陌生。我看过一些关于通过存储库模式对控制器进行单元测试的视频,但这是一个 CQRS。下面是表示层(API)。我从应用程序层调用命令或查询。

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> GetAllProducts()
{
    var products = await _mediator.Send(new GetAllProductsQuery());
    return Ok(products);
}

我想测试控制器,因此我在 xUnit 项目上添加了对 API 的引用。我尝试根据存储库模式从组中构建应用程序层中的命令和查询,但失败了!

c# unit-testing moq xunit cqrs
1个回答
0
投票

假设(为了简单起见)

_mediator
是这个
IMediator
接口的实例,通过控制器的构造函数注入:

public interface IMediator
{
    Task<IReadOnlyCollection<Product>> Send(GetAllProductsQuery getAllProductsQuery);
}

您可以像这样编写控制器操作的单元测试:

[Fact]
public async Task GetAllProductsReturnsOk()
{
    var td = new Mock<IMediator>();
    var expected = new[] { new Product() };
    td.Setup(m => m.Send(It.IsAny<GetAllProductsQuery>())).ReturnsAsync(expected);
    var sut = new ProductsController(td.Object);

    var result = await sut.GetAllProducts();

    var ok = Assert.IsAssignableFrom<OkObjectResult>(result);
    Assert.Equal(expected, ok.Value);
}

此测试使用我的标准测试角色名称AAA布局启发式

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