Возникли проблемы с написанием модульного теста для конечной точки, которая использует службу, как ее правильно написать? - PullRequest
0 голосов
/ 29 мая 2020

Я не писал конечную точку или службу. Мне нужно использовать эту конечную точку для приложения, которое я создаю, и меня попросили написать для нее модульный тест. У меня проблемы с правильным написанием теста. Вот что я получил в своем тесте:

public void GetExceptionReportSessionData_ReturnsSessionData()
        {
            //Arrange 
            var response = new RetrieveExceptionReportSessionDatesResponse();
            var serviceClient = new Mock<WorkflowService.WorkflowService>();      
            serviceClient
                .Setup(x => x.RetrieveExceptionReportSessionDatesAsync(It.IsAny<RetrieveExceptionReportSessionDatesRequest>()))
               .ReturnsAsync(response);

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

            var controller = new ExceptionReportController(loggerMock.Object);

            var ctx = new ControllerContext() { HttpContext = new DefaultHttpContext() };
            ctx.HttpContext.Request.Headers["token"] = "fake_token_here"; //Set header
            controller.ControllerContext = ctx;

            //Act
            var result = controller.GetExceptionReportSessionData();

            //Assert
            var viewResult = Assert.IsType<OkObjectResult>(result);

            Assert.Equal(StatusCodes.Status200OK, viewResult.StatusCode);

        }

Вот logi конечной точки c:

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

Вот метод GetSessionData, вызываемый в конечной точке:

private 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;
    }

Как мне завершить sh написание успешного теста?

1 Ответ

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

Вы не предоставили определение метода ResolveServiceClient().

Чтобы написать модульный тест, выполните следующие действия.

  1. Изучите модульное тестирование. Без шуток. Прежде чем писать какой-либо модульный тест, вы должны иметь некоторое представление о том, как он работает и зачем их писать. Понимание принципов SOLID может помочь в этом процессе.
  2. Проанализируйте SUT или метод, который вы тестируете, и перечислите все зависимости. Внешние зависимости - это классы, которые выполняют некоторые задачи для вашего метода. Вы тестируете текущий метод, поэтому все, что не принадлежит вашему классу, должно быть развязано . Другими словами, вы не можете провести модульное тестирование класса, который вызывает методы stati c и инициализирует внешние зависимости в коде метода. Здесь в вашем коде LogFormatter и WebUtilities кажется, что они являются классами c stati.
  3. Проанализируйте метод и запишите все точки выхода . Например, операторы возврата, исключения и т. Д. c. Вы должны написать как минимум один модульный тест для каждого оператора выхода .
  4. Проанализируйте метод и запишите все условия if-else. Вы должны написать модульный тест для каждого условия .

Помимо всей теории, ваш контроллер кажется простым случаем. Здесь, если LogFormatter не выдает никаких ошибок, то вам не нужно разъединять его. Но WebUtility кажется проблематичным c. Итак, я бы предложил создать для него службу и внедрить ее в контроллер, чтобы вы могли передать Mock или Stub из модульного теста.

Там нет ничего проблематичного c в методе GetSessions() просто напишите регистры для каждого условия , и вам будет хорошо go.

Один маленький совет, я стараюсь контроллеры максимально легкие. Обычно мои контроллеры просто преобразуют DTO для обслуживания DTO и вызывают эту службу. Поэтому я не пишу модульные тесты для контроллеров. Но я не уверен, что все так делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...