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

Oma*_*OUG 4 c# unit-testing mstest visual-studio-2017 asp.net-core-2.0

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

此操作的测试之一如下所示:

[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>>));
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是ASP.Net Core项目测试中不知道OkNegotiatedContentResult

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

Cod*_*ler 5

这里的问题是在ASP网络核心项目测试中OkNegotiatedContentResult是未知的,我应该使用什么来测试Ok()结果?

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

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

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

var actionResult = await controller.Get() as OkNegotiatedContentResult<IEnumerable<GroupDto>>;
Assert.IsInstanceOfType(actionResult, typeof(OkNegotiatedContentResult<IEnumerable<GroupDto>>));
Run Code Online (Sandbox Code Playgroud)

asnull如果无法将对象强制转换为请求的类型,则运算符将返回。因此,您可以将第二张支票替换为以下内容:

Assert.IsNotNull(actionResult);
Run Code Online (Sandbox Code Playgroud)

因此,所需步骤为:

  1. Microsoft.AspNetCore.MvcNuGet软件包安装到您的Test项目。
  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>));
    }
    
    Run Code Online (Sandbox Code Playgroud)