Как правильно настроить фиктивные данные для модульного теста? - PullRequest
1 голос
/ 27 мая 2020

Возникли некоторые проблемы с настройкой моих фиктивных данных для модульного теста в моем API. Данные извлекаются из службы. Вот моя конечная точка и то, как извлекаются данные:

RetrieveExceptionReportSessionDatesResponse response
                    = await ResolveServiceClient().RetrieveExceptionReportSessionDatesAsync(new RetrieveExceptionReportSessionDatesRequest());

                List<ExceptionReportSessionDataModel> result
                    = GetSessionData(response.RetrieveExceptionReportSessionDatesResult);

                if (result != null && result.Count > 0)
                {
                    logText = LogFormatter.Format(
                                    WebUtilities.GetUser((ClaimsIdentity)HttpContext.User.Identity),
                                    startTime, DateTime.Now, Privilege.EditSession,
                                    "Get Exception Report Session Data", "Exception Report Session Data retrieved successfully.");
                    logger.LogInfo(logText);
                }
                else
                {
                    logText = LogFormatter.Format(
                                    WebUtilities.GetUser((ClaimsIdentity)HttpContext.User.Identity),
                                    startTime, DateTime.Now, Privilege.ViewOrderExceptionReport,
                                    "Get exception report session data", "Exception report session data is null or empty.");
                    logger.LogWarn(logText);
                }
                return Ok(result);

Вот что у меня есть до сих пор при настройке моего модульного теста:

//Arrange          
            List<ExceptionReportSessionDataModel> sessionData = new List<ExceptionReportSessionDataModel>()
            { 
                new ExceptionReportSessionDataModel() {SessionName = "Session1", ReportFiles = null },
                new ExceptionReportSessionDataModel() {SessionName = "Session2", ReportFiles = null },
                new ExceptionReportSessionDataModel() {SessionName = "Session3", ReportFiles = null }
            };

            //NEED HELP HERE
            var ERSessionDataMock = new Mock<>();
            ERSessionDataMock.Setup(x => x.).Returns();

            var loggerMock = new Mock<ILogger>();
            loggerMock.Setup(x => x.LogInfo(null));

Метод GetSessionData:

public List<ExceptionReportSessionDataModel> GetSessionData(string sessionData)
        {
            List<ExceptionReportSessionDataModel> reports = new List<ExceptionReportSessionDataModel>();
            if (!string.IsNullOrWhiteSpace(sessionData))
            {
                string[] splitString = sessionData.Split("\n", StringSplitOptions.RemoveEmptyEntries);

                foreach (string s in splitString)
                {
                    string[] temp = s.Split(",", StringSplitOptions.RemoveEmptyEntries);

                    List<string> files = new List<string>();

                    for (int index = 1; index < temp.Length; index++)
                    {
                        files.Add(temp[index]);
                    }
                    reports.Add(new ExceptionReportSessionDataModel()
                    {
                        ReportFiles = files,
                        SessionName = temp[0]
                    });
                }
            }
            return reports;
        }

Мне нужна помощь в настройке ERSessionDataMock

1 Ответ

1 голос
/ 27 мая 2020

Невозможно узнать, не увидев, как реализован метод GetSessionData. Но вот несколько быстрых предложений:

  1. Добавьте свой ServiceClient в качестве зависимости вместо вызова метода для ее получения. Он должен либо:

    • быть interface (например, IServiceClient) - затем в вашем Startup.cs классе:
      services.AddScoped<IServiceClient>(sp => ResolveServiceClient().Result);
      
    • или метод RetrieveExceptionReportSessionDatesAsync требует быть virtual или abstract, чтобы вы могли переопределить его с помощью макета:
      public virtual RetrieveExceptionReportSessionDatesAsync(RetrieveExceptionReportSessionDatesRequest request);
      
  2. Затем в своем тесте создайте переменную response, которая будет выполнять GetSessionData определенным образом, чтобы получить либо пустой List<ExceptionReportSessionDataModel>, либо нет, в зависимости от теста (опять же, невозможно узнать, как именно, не видя вашего logi c):

    var response = new RetrieveExceptionReportSessionDatesResponse();
    
  3. И переопределите метод RetrieveExceptionReportSessionDatesAsync на макете:
    var serviceClient = new Mock<IServiceClient>();
    serviceClient
        .Setup(x => x.RetrieveExceptionReportSessionDatesAsync(It.IsAny<RetrieveExceptionReportSessionDatesRequest>()))
        .Returns(response);
    
  4. Теперь, если вы настроили response таким образом, чтобы GetSessionData возвращал List<ExceptionReportSessionDataModel> с Count > 0, вы можете проверить это сообщение журнала, в противном случае проверьте противоположное сообщение журнала.

Но, IMO, способ написания этого кода делает модульное тестирование рутинной работой. Кажется, вы не пользуетесь преимуществами внедрения зависимостей.

ОБНОВЛЕНИЕ:

Кажется, вы можете назначить response как:

var response = new RetrieveExceptionReportSessionDatesResponse
{
    RetrieveExceptionReportSessionDatesResult = Guid.NewGuid().ToString()
}

и убедитесь, что logger.LogInfo вызывается с помощью Privilege.EditSession, или назначьте ответ как:

var response = new RetrieveExceptionReportSessionDatesResponse
{
    RetrieveExceptionReportSessionDatesResult = string.Empty
}

и убедитесь, что logger.LogWarn вызывается с помощью Privilege.ViewOrderExceptionReport.

Просто еще одно замечание - есть ли погрешность погрешности для l oop? (Он смотрит на индекс 1)

...