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

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

我想测试控制器,所以我在xUnit项目上添加了对API的引用.我试图根据存储库模式从分组开始组织应用层中的命令和查询,但失败了!

推荐答案

假设(为简单起见)_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);
}

这个测试使用我的标准test role namesAAA layout heuristic.

Csharp相关问答推荐

在C# 11之前, struct 中的每个字段都必须显式分配?不能繁殖

在命令行中使用时安装,但在单击时不会安装

如何使用CsvReader获取给定列索引的列标题?

是否可以使用EF—Core进行临时部分更新?

如何从HttpContext获取请求正文

Blazor Foreach仅渲染最后一种 colored颜色

在命名管道上使用GRPC ASP.NET核心时如何配置命名管道权限

如何从ASP.NET核心MVC视图和Blazor传递数据

在实体框架中处理通用实体&S变更跟踪器

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

如何在C#中将方法/线程启动传递给基本构造函数

如何在我的C#应用程序中设置带有reactjs前端的SignalR服务器?

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

异步任务调用程序集

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

Visual Studio如何使用当前的框架?

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

在C#中通过Matheval使用自定义公式

如何根据分割文本的块数来计算文本的大小?

PowerShell:如何[引用]数组中的元素?