【问题标题】:How to test a log method in catch block in Unit test如何在单元测试的 catch 块中测试日志方法
【发布时间】:2014-03-13 01:06:55
【问题描述】:

我正在为以下代码编写单元测试

    protected virtual string GetTokenFromTheWebrequest(WebRequest httpWebRequestObject)
    {
        try
        {
            HttpWebResponse responseHttpPostForToken = (HttpWebResponse)httpWebRequestObject.GetResponse();
            string tokenJson = GetContentResponse(responseHttpPostForToken);
            AccessToken accesstokenObj = DeserializeToAccessToken(tokenJson);
            return accesstokenObj.Token;
        }
        catch (Exception Error)
        {
            Log.Debug("error");//I want to test this method
            throw Error;
        }
    }

所以,为此我有这个单元测试

     [Test]
    [ExpectedException(typeof(JsonReaderException))]
    public void GetTokenFromTheWebrequestTestwithInValidHttpWebResponseOjectJsonReader()
    {
        var mockHttpWebResponse = new Mock<HttpWebResponse>();
        var mockHttpWebRequest = new Mock<HttpWebRequest>();
        var mockLog = new Mock<ILog>();
        mockHttpWebRequest.Setup(c => c.GetResponse()).Returns(mockHttpWebResponse.Object);
        mockedSurveyMonkeyAPIService.Setup(y => y.GetContentResponse(mockHttpWebResponse.Object)).Returns(TestData.TestData.SampleResponseStream);
        mockedSurveyMonkeyAPIService.Setup(z => z.DeserializeToAccessToken(TestData.TestData.SampleResponseStream)).Throws(new JsonReaderException());
        //mockLog.Setup(x => x.Debug("error")).Throws(new WebException());
        var token = mockedSurveyMonkeyAPIService.Object.GetTokenFromTheWebrequest(mockHttpWebRequest.Object);
        mockLog.VerifySet(x => x.Debug("error"),Times.Once); //its not going till this when i debug
    }

谁能建议如何检查 Log.Debug 是否被正确调用。

【问题讨论】:

    标签: c# asp.net unit-testing nunit


    【解决方案1】:

    您似乎没有测试您自己的任何代码...您已经模拟了该方法中使用的几乎所有内容。这引出了what is actually being tested 的问题,答案是正在测试您的实现细节,而不是任何逻辑。您甚至嘲笑了记录器,所以您实际上是在此处测试 .NET 的 try-catch 机制。

    如果您对此方法进行任何细微更改,即使行为相同,您的测试也会中断。这不是你想束缚自己的测试。

    有更好的测试方法。例如,如果你想测试你的记录器 - 单独测试它,这样你就知道你的记录器工作正常。不要通过在任何使用它的地方测试对它的调用来测试记录器。

    【讨论】:

    • 好的,我将在单独的测试方法中测试我的日志功能,我应该怎么做,我的意思是我的测试断言语句或验证语句应该是什么样子。
    • 你的记录器做什么/暴露?
    • 我正在使用 log4net,它会将错误消息及其详细信息写入文件中,您需要更多详细信息吗?
    • 好的,你想确保什么......你已经正确配置了 log4net?这确实是一个集成测试,因为要真正测试它,您必须检查日志文件。
    • 我想检查是否发生异常,我的 log.debug 被正确调用,我应该检查它是否被调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2020-06-14
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多