【问题标题】:Catch exception in xunit test在 xunit 测试中捕获异常
【发布时间】:2020-05-19 14:47:14
【问题描述】:

我能否捕获出现在日志中但未出现在测试中的异常?

我执行了测试,它返回了状态:OK,但在日志中我有: 将创建包发布到 Kafka 时出现意外错误。 id = 5ec3eb81aa662c8a7c76e5e8。异常:System.NullReferenceException:对象引用未设置为对象的实例。

如何在测试中捕捉到这个异常?我尝试使用 Try and catch (Exception),但没有任何捕获。

 [Fact]
    [DisplayTestMethodName]
    public async Task ExceptionTest()
    {
        try
        {
            var testRequest= @"{""Test1"":"1234"};
            var testRequestResp =
                await fixture.PostAsync(testRequest);
            Assert.Equal("HttpStatusCode: " + System.Net.HttpStatusCode.OK, "HttpStatusCode: " + testRequestResp.StatusCode);
        }
        catch (Exception ex)
        {
            Assert.True(ex == null, "Exception: " + ex.Message);
        }

日志 VS log

【问题讨论】:

    标签: c# integration-testing xunit.net fact


    【解决方案1】:

    这意味着您已经在您的 PostAsync 方法中的某个地方处理了 NullReferenceException 并且仍然返回状态 200。这是一个设计决定,可以吞下错误并返回“OK”(希望您正在记录它或至少)。

    另一种方法是返回 500 状态而不是 200,以表明发生了内部服务器错误 - 然后尝试解决 NullReferenceException

    你也可以选择来吞下你PostAsync方法中的错误,让它一直冒泡。在这种情况下,您可以使用:

    var exception = await Assert.ThrowsAsync<NullReferenceException>(() => fixture.PostAsync(testRequest));
    

    testRequest 是您知道会触发该错误的东西)

    如果获得NullReferenceException 是预期行为,并且请求仍处于“OK”状态,那么在您的测试中以某种方式捕获它是没有意义的。

    【讨论】:

      【解决方案2】:

      我想检查是否没有发生异常“NullReferenceException”。 我采纳了你的建议:

      var exception = await Assert.ThrowsAsync<NullReferenceException>(() => fixture.PostAsync(testRequest));
      

      但我没有捕捉到这个异常

      问题出在哪里?

      【讨论】:

      • 是的。就像我在回答中所说的那样,这是因为异常正在某个地方的 PostAsync 方法中被吞噬(可能在不会重新抛出它的 try/catch 块中)。
      • 这应该是对另一个答案的评论(您可以在问题末尾编辑后续内容)
      猜你喜欢
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      相关资源
      最近更新 更多