【问题标题】:How to test Ok() result using MStest in ASP.NET Core project如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果
【发布时间】:2018-09-05 13:15:41
【问题描述】:

我正在使用 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 Core 项目测试中是未知的。

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

【问题讨论】:

  • 您不必测试控制器。它并没有真正做任何事情。只需测试来自 repo 的结果。
  • @illug,测试返回类型怎么样,我认为这很重要。
  • 我认为这无关紧要,不是来自控制器的回报,而是来自回购的回报。 DI 的优点之一是能够不测试控制器。如果您还需要进行身份验证,则会遇到问题。

标签: c# unit-testing visual-studio-2017 mstest asp.net-core-2.0


【解决方案1】:

这里的问题是 OkNegotiatedContentResult 在 asp net 中是未知的 core project test 我应该用什么来测试 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>>));

as 运算符将返回 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>));
    }
    

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    相关资源
    最近更新 更多