您似乎对什么是模拟/单元测试感到有些困惑。模拟通常是为正在测试的类“外部”的任何东西创建的。单元测试在你的代码上运行(通常是一个方法,或者它的一部分)。
您应该为执行日志记录的类编写单元测试,方法是调用接收/回复带有模拟对象的推文的方法,并测试预期结果。
如果您也模拟您的日志记录类可能会更好,因为直接测试文件可能会变得复杂并且不推荐。
例如,您的班级可能有这些方法。
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"));
}