对收到和回复的推文进行模拟测试

本文关键字:文进行 模拟 测试 回复 | 更新日期: 2023-09-27 17:56:48

我有两个接口,分别是ITweetReqITweetResp

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

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

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

我正在使用 NUnit 和 Moq 框架。

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

对收到和回复的推文进行模拟测试

你似乎对什么是模拟/单元测试有点困惑。模拟通常是为被测试的类的"外部"创建的任何内容。单元测试在代码(通常是方法或方法的一部分)上运行。

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

如果你也模拟你的日志记录类可能会更好,因为直接测试文件可能会变得复杂,不建议这样做。

例如,您的类中可能有这些方法。

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"));
}