Как проверить в сложном методе xunit - PullRequest
0 голосов
/ 21 января 2019

Как я могу протестировать в asp.net core 2.0 следующий метод, который существует в отдельном проекте, чем мой тестовый проект? например, вот так:

 public partial class LoanRequestServiceController : BaseServiceController
 {
    public ServiceDTO<AP_CBO> AddCBO(AP_CBO cbo)
    {
        ServiceDTO<AP_CBO> dto = new ServiceDTO<AP_CBO>();

        try
        {
            using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.Snapshot }))
            {
                cbo.ID_CBO = 333;
                dto.Data = cbo;
                scope.Complete();
            }
        }
        catch (Exception ex)
        {
            dto.Error = new ServiceError(ex);
            Globals.Logger.Error(ex);
        }
        finally
        {
            //Globals.CastleComponentsContainer.Release(LoanRequestDAL);
        }
        return dto;
    }
 }

Я протестировал некоторые «легкие» методы, например, если сервисный метод возвращает SucessCode, и он работает. Вот мой тестовый класс:

    [Theory]
    [InlineData("/Sample/AddCBO")]
    public async Task Test_AddCBO(string url)
    {
        //Arrange
        var client = _factory.CreateClient();

        //Act
        var response = await client.GetAsync(url);

        //Assert

        response.EnsureSuccessStatusCode();
        //Compare two dto objects AP_CBO
        //object expected = new AP_CBO { properties... }
        // object responseObject = response.Content...
        //Assert.Equal(expected, responseObject);
    }

Я не знаю, как проверить объект с несколькими свойствами. Может быть, мне нужно использовать Moq? Теоретически, этот метод будет идти в DAL (Уровень DatabaseAccess) и возвращаться из упакованного объекта базы данных и возвращаться к API, или в моем случае обратно в тест.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Это довольно длинная тема для подробного объяснения здесь; Я думаю, будет лучше, если вы последуете примеру и прочитаете детали.

Я предполагаю, что вы собираетесь написать модульный тест; для модульного теста я могу порекомендовать этот учебник, который может вам помочь. отметьте это, пожалуйста

0 голосов
/ 21 января 2019

Прежде всего, вы должны решить, какой уровень тестов вы хотите написать.

Если вы пишете Модульный тест , вы должны смоделировать все внешние интеграции (вВ вашем случае я могу определить HTTP-запрос -> Контроллер и Контроллер -> База данных ).Это основа вашего функционального тестирования.Так что, если вы пишете модульные тесты, да, вы должны использовать фальшивый фреймворк, такой как NSubstitute или Moq (и только тестировать поведение вашего метода, вызывая его).

Тестовый пример, который вы разместили, выглядит для меня как тест интеграции , поскольку вы включаете интеграцию HTTP-запрос -> Контроллер .В этом случае я бы заполнил базу данных данными (если это уместно) и фактически вызвал бы вашу конечную точку API (как вы уже делаете).

Чтобы проверить содержание (DTO) ответа в ASP.Net Core, вам необходимо сделать следующее:

// ...
var response = await client.GetAsync(url);

response.EnsureSuccessStatusCode();

var content = await httpResponseMessage.Content.ReadAsStringAsync();
var serviceDto = JsonConvert.DeserializeObject<ServiceDTO<AP_CBO>>(content); // Only for Json
// Validate serviceDto
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...