0

我有两个名为ITweetReq和的接口ITweetResp

Requests当推文进来时,一个外部服务发送来发送推文,这是由接口实现的ITweetReq,我们的系统作为回报将回复发送回来,这是在ITweetResp接口中实现的。

传入和传出消息都记录在文件中。我必须对日志文件进行单元测试,以确保它记录了正确数量的接收和回复的消息。

我想知道是否应该模拟两个接口然后对日志文件进行测试,但不知道如何去做。任何帮助或建议将不胜感激。

我正在使用 NUnit 和 Moq 框架。

   var TweetReq = new Mock<ITweetReq>();
   var TweetRes = new Mock<ITweetRes>();
4

1 回答 1

1

您似乎对什么是模拟/单元测试感到有些困惑。模拟通常是为正在测试的类“外部”的任何东西创建的。单元测试在你的代码上运行(通常是一个方法,或者它的一部分)。

您应该为执行日志记录的类编写单元测试,方法是调用接收/回复带有模拟对象的推文的方法,并测试预期结果。

如果您也模拟您的日志记录类可能会更好,因为直接测试文件可能会变得复杂并且不推荐。

例如,您的班级可能有这些方法。

public class TweetHandler
{
    public void Main()
    {
        ILogger logger = GetLogger();

        while (true)
        {
            ITweetReq request = GetNextRequest();

            ITweetRes response = HandleRequest(request, logger);

            SendResponse(response, logger);
        }
    }

    public ITweetRes HandleRequest(ITweetReq request, ILogger logger)
    {
        int id = request.Id;
        string text = request.Text;

        logger.Log("Received tweet " + id + " with text: " + text);

        return new TweetResponse(id, text);
    }

    public void SendResponse(ITweetRes response, ILogger logger)
    {
        logger.Log("Sending response to tweet: " + response.Id);
        Response(reponse);
    }
}

然后,您可以像这样编写单元测试:

[TestMethod]
public void HandleRequest_ShouldLogIdAndText()
{
    // Arrange
    var handler = new TweetHandler();
    var mockRequest = new Mock<ITweetReq>();
    var mockLogger = new Mock<ILogger>();

    mockRequest.Setup(x => x.Id).Returns(10);
    mockRequest.Setup(x => x.Text).Returns("some text");

    // Act
    handler.HandleRequest(mockRequest, mockLogger);

    // Assert
    mockLogger.Verify(x => x.Log("Received tweet 10 with text: some text"));
}

[TestMethod]
public void SendResponse_ShouldLogId()
{
    // Arrange
    var handler = new TweetHandler();
    var mockResponse = new Mock<ITweetRes>();
    var mockLogger = new Mock<ILogger>();

    mockResponse.Setup(x => x.Id).Returns(20);

    // Act
    handler.SendReponse(mockResponse, mockLogger);

    // Assert
    mockLogger.Verify(x => x.Log("Sending response to tweet: 20"));
}
于 2013-01-30T07:41:59.337 回答