0

とという2つのインターフェースが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 に答える