我有一个产品 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 的引用。我尝试根据存储库模式从组中构建应用程序层中的命令和查询,但失败了!
假设(为了简单起见)
_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);
}