モック/ユニットテストとは何かについて少し混乱しているようです。モックは通常、テスト対象のクラスの「外部」にあるものに対して作成されます。単体テストはコード(通常はメソッドまたはその一部)で実行されます。
モックオブジェクトを使用してツイートを受信/返信するメソッドを呼び出し、期待される結果をテストすることにより、ロギングを行うクラスの単体テストを作成する必要があります。
ファイルを直接テストすることは複雑になる可能性があり、推奨されないため、ロギングクラスもモックした方がよい場合があります。
たとえば、クラスにこれらのメソッドがあるとします。
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"));
}