如何在 ASP.NET 核心项目中使用 MStest 测试 Ok() 结果

How to test Ok() result using MStest in ASP.NET Core project

我正在使用 MStest 测试我的控制器。

我想测试这个动作:

[HttpGet(Name = "GetGroups")]
public async Task<IActionResult> Get()
{
    var groups = await _unitOfWork.Repository<Groupe>().GetAllAsync();
    var groupsDto = Mapper.Map<IEnumerable<GroupDto>>(groups);
    if (groupsDto.Count() == 0)
    {
        return NotFound();
    }
    return Ok(groupsDto);
}

此操作的其中一个测试如下所示:

[TestMethod]
public async Task Group_Get_Should_Return_InstanceOfTypeOkNegotiatedContentResultIEnumerableGroupDto()
{
    // Arrange
    moqGroupRepository.Setup(g => g.GetAllAsync(null)).ReturnsAsync(groups).Verifiable();
    moqUnitOfWork.Setup(x => x.Repository<Groupe>()).Returns(moqGroupRepository.Object);

    var controller = new GroupController(moqUnitOfWork.Object);

    // Act
    var actionResult = await controller.Get() as OkNegotiatedContentResult<IEnumerable<GroupDto>>;

    // Assert
    Assert.IsInstanceOfType(actionResult, typeof(OkNegotiatedContentResult<IEnumerable<GroupDto>>));
}

这里的问题是 OkNegotiatedContentResult 在 ASP.Net 核心项目测试中未知。

我应该用什么来测试 Ok() 结果?

The probleme here is OkNegotiatedContentResult is unknow in asp net core project test What should i use to test Ok() result?

您可以通过安装 Microsoft.AspNetCore.Mvc NuGet 包来解决此问题,其中定义了 IActionResult 的实现。

但是 ASP.NET 核心不包含 OkNegotiatedContentResult 类型,它来自 ASP.NET Web API。在 ASP.NET 核心 Controller.Ok() 方法中 returns OkObjectResult 类型的实例。

你在这两个语句中也有不一致的检查:

var actionResult = await controller.Get() as OkNegotiatedContentResult<IEnumerable<GroupDto>>;
Assert.IsInstanceOfType(actionResult, typeof(OkNegotiatedContentResult<IEnumerable<GroupDto>>));
如果对象无法转换为请求的类型,

as 运算符将 return null。所以你可以用以下内容替换第二个检查:

Assert.IsNotNull(actionResult);

因此所需的步骤是:

  1. 安装 Microsoft.AspNetCore.Mvc NuGet 包到您的测试项目。
  2. 调整测试代码如下:

    // ...
    using Microsoft.AspNetCore.Mvc;
    
    [TestMethod]
    public async Task Group_Get_Should_Return_InstanceOfTypeOkNegotiatedContentResultIEnumerableGroupDto()
    {
        // Arrange
        moqGroupRepository.Setup(g => g.GetAllAsync(null)).ReturnsAsync(groups).Verifiable();
        moqUnitOfWork.Setup(x => x.Repository<Groupe>()).Returns(moqGroupRepository.Object);
    
        var controller = new GroupController(moqUnitOfWork.Object);
    
        // Act
        var actionResult = await controller.Get() as OkObjectResult;
    
        // Assert
        Assert.IsNotNull(actionResult);
        Assert.IsInstanceOfType(actionResult.Value, typeof(IEnumerable<GroupDto>));
    }
    

Code Fuller 的 post 有帮助。最后一个 Assert 应该有点不同,可能是因为我们现在是 3.0:

    Assert.IsInstanceOfType(typeof(IEnumerable<GroupDto>), actionResult.Value);