如何使用 Moq 对 WEB API 控制器异常进行单元测试

吉姆·洛博

如何使用状态代码 500 和消息对 IHttpActionResult 异常 InternalServerError 进行单元测试

[HttpGet]
public async Task<IHttpActionResult> Get(Guid myId)
{
    try
    {
        var myaccount = await _myaccountService.GetMyAccount(myId);
        return Ok(myaccount);
    }
    catch (Exception ex)
    {
        return InternalServerError();
    }
}

尝试过测试方法

[TestMethod]
public async Task GeMyAccount_WhenThrowsException_ReturnsServerError()
{
    // Arrange         
    var exception = new Exception("Internal Server Error");
    var expectedResult = new List<MyAccount>
    {
        new  MyAccount
        {
            Id = "1",
            Name = "Name1"
        },
        new  MyAccount
        {
            Id = "2",
            Name = "Name2"
        },
    };
    var myId = new Guid();

    //Act 
    var mockMyAccountService = new Mock<IMyAccountService>();
    mockMyAccountService.Setup(mock => 
    mock.GetMyAccount(myId)).Throws(exception).Verifiable();   
    var controller = new MyAccountController(mockMyAccountService.Object);

    //Assert
    var actualResult = (await controller.Get(myId) as 
    OkNegotiatedContentResult<MyAccount>).Content;       
       ?? var result = actualResult as ObjectResult;
       ?? Assert.AreEqual(StatusCodes.Status500InternalServerError, result.StatusCode);
       ?? Assert.AreEqual("Internal Server Error ", result.Value);
      mockMyAccountService.Verify(b => b.GetMyAccount(myId));
}

不确定如何使用 Moq 获取异常和状态代码 500。

彼得·恰拉

正如 Nkosi 所说,异常被 try-catch 块吞下,因此您无法对异常做出任何断言。

但是您可以(并且应该)对返回的对象进行断言。

[TestMethod]
public async Task GivenAFaultyMyAccountService_WhenICallGet_ThenItReturnsAnInternalServerError()
{
    //Arrange         
    var expectedException = new Exception("Something went wrong");
    var mockMyAccountService = new Mock<IMyAccountService>();
    
    mockMyAccountService
       .Setup(svc => svc.GetMyAccount(It.IsAny<Guid>()))
       .Throws(expectedException);   
    
    var sut = new MyAccountController(mockMyAccountService.Object);

    //Act 
    var actualResult = await sut.Get(Guid.NewGuid());

    //Assert
    Assert.IsInstanceOfType(actualResult, typeof(InternalServerErrorResult));
}

我对您的测试进行了以下更改:

  • 我已将您的测试重命名为与Given-When-Then 结构保持一致
  • 在这个测试用例,我只专注于一个单一的当底层依赖性错误的情况,所以我摆脱这是关系到幸福的路径一切
    • 快乐的路径应该有一个单独的测试用例
  • Setup通过将myId参数替换It.IsAny<Guid>()
  • 我还替换了new Guid()toGuid.NewGuid()因为前者会创建一个空的 uuid,而后者会生成一个新的 uuid
  • 我已经删除了这个Verifiable电话,因为这里并不真正需要它
  • 法案阶段是当你对一个给定的方法的实际调用,而不是当你正在构建控制器,所以我移动到正确的地方的评论
  • 我已将变量名称更改controllersut,它代表被测系统
  • 我已将您难以阅读的评估逻辑替换为简单的类型检查

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对iOS视图控制器进行单元测试?

在使用Moq和AutoFixture进行单元测试API时模拟HttpResponseMessage

使用JWT声明对.NET Core Web API控制器进行单元测试

如何使用Entity Framework和Moq进行单元测试?

如何对Symfony控制器进行单元测试

单元测试Web API控制器

ASP.Net Web API控制器单元测试失败

ASP.Net Web API控制器单元测试POST

ASP.Net Web API 2控制器单元测试获取请求项计数

在ConfigureServices中使用自定义HttpClient和Polly策略进行单元测试核心API控制器

Web API-OWIN中HttpContext.Current的问题,用于使用moq进行集成测试

如何使用Moq Azure Key Vault进行单元测试

使用Moq和Mock设置的具有IConfiguration的单元测试控制器返回null

使用Asp.Net Web Api和客户筛选器进行单元测试

如何模拟ExceptionContext以使用.NET Core 3 Web API和Moq进行测试

如何使用XUnit对Web API控制器进行单元测试

单元测试.NET Core 3 Web API控制器

当存在“ this”关键字时,如何使用xUnit和Moq测试Web api方法

在常规mvc控制器(不是Web api控制器)中使用标识的单元测试方法

如何对返回模型的控制器进行单元测试?

Web API控制器单元测试

MOQ对象设置范围/上下文因构建器模式单元测试和Web API控制器而丢失

使用Moq进行单元测试

使用Moq对MVC6中的控制器路由功能进行单元测试

如何使用 Moq 对具有三个依赖项的 MVC 控制器进行单元测试

使用 Moq 框架进行单元测试

使用 MOQ 在 web api 中模拟 HttpContext

使用 xunit 和 moq 进行 net core api 控制器单元测试

使用 moq 对 Web API 控制器 actualResult 进行单元测试的行为与预期不符