Vinod Jangle Ответов: 1

Модульный тест для метода, возвращающего пустоту


Приветствия.

У меня есть метод, возвращающий VOID, и я написал ниже модульный тест с помощью "Microsoft.VisualStudio.Тестовые инструменты.UnitTesting" для него. Есть ли для этого лучшая альтернатива?

Что я уже пробовал:

using (var uow = new UOW.SalesEntityUOW())
{
    try
    {
        uow.MyMethodCall(); // This method will update data and return nothing.
    }
    catch (Exception ex)
    {
        Assert.IsFalse(true);
    }
    finally
    {
        Assert.IsTrue(true);
    }
}

Eric Lynch

Трудно сказать, судя по этому фрагменту. Говоря в общем, я бы проверил данные, которые были изменены, и добавил утверждение о точности этого изменения. Например, если вы ожидали, что ячейка данных будет изменена с 1 на 2, после вызова метода подтвердите, что ячейка данных равна 2.

F-ES Sitecore

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

GregoryPres

Если этот метод изменяет внутреннее состояние, то вам необходимо проверить значения членов, которые были затронуты, или проверить, что внутренние методы были вызваны с правильными аргументами.

1 Ответов

Рейтинг:
0

Scyldshefing

Я бы согласился, что представленный тест не тестирует метод void. Он даже не проверяет, что ожидаемое исключение возникает, когда возникает определенное условие. Все, что он делает, это проверяет, что что-то работает и не создает исключения. Метод Void можно протестировать, но вам нужно будет посмотреть на использование насмешливого фреймворка и какой-то формы внедрения зависимостей. В TDD вы должны разрабатывать тест перед созданием кода, и поэтому тест определяет, что должен делать код.

Вот образец тестируемого метода void:

/// <summary>
/// Creates the model.
/// </summary>
/// <param name="activityId">The activity identifier.</param>
/// <param name="documentModel">The document model.</param>
/// <exception cref="NotImplementedException"></exception>
public void CreateModel(string activityId, string documentModel)
{
    this.UpdateModel(activityId, documentModel);
}

он использует следующий частный метод:
/// <summary>
/// Updates the model.
/// </summary>
/// <param name="activityId">The activity identifier.</param>
/// <param name="documentModel">The document model.</param>
public void UpdateModel(string activityId, string documentModel)
{
    FlattenedActivityModel activityModel = null;
    IAzureContainer azureContainer = ClassContainer.Resolve<IAzureContainer>();
    IPublishActivityEvents publisher = ClassContainer.Resolve<IPublishActivityEvents>();
    var searchQuery = string.Format(CultureInfo.CurrentCulture, "activityId:{0}", activityId);
    var activityModels = azureContainer.ActivitySearch(string.Empty, searchQuery);
    if (activityModels != null)
    {
        if (activityModels.Count > 0)
        {
            activityModel = activityModels[0];
        }
    }

    FlattenedDocumentModel model = new FlattenedDocumentModel(activityModel, documentModel);
    var metadata = JsonConvert.SerializeObject(model);
    publisher.PublishDocumentMetadata(metadata, activityModel.RootName, model.MetadataFileName);
}


Один из тестов для проверки кода будет выглядеть следующим образом:

[TestMethod]
        public void When_CreateModel_Is_Called_Then_Model_Is_Created_As_Expected()
        {
            var activityContent = File.ReadAllText(@"TestData\FlattenedActivity.json");
            var activity = JsonConvert.DeserializeObject<FlattenedActivityModel>(activityContent);
            var documentRequest = File.ReadAllText(@"TestData\DocumentRequest.json");

            var activityId = Guid.NewGuid().ToString();
            var document1 = new FlattenedDocumentModel
            {
                DocumentId = Guid.NewGuid().ToString(),
                ActivityId = activityId
            };
            var documents = new Collection<FlattenedDocumentModel>
            {
                document1
            };
            var azureConatiner = new Mock<IAzureContainer>();

            var activities = new Collection<FlattenedActivityModel>();
            activity.ActivityId = activityId;
            activities.Add(activity);

            //get the activity
            var queryString = string.Format("activityId:{0}", activityId);
            azureConatiner.Setup(a => a.ActivitySearch(string.Empty, queryString)).Returns(activities);

            var publishActivityEvents = new Mock<IPublishActivityEvents>();

            // Register the components to the IOC container
            ClassContainer.InitialiseRegistrations();
            ClassContainer.RegisterInstance(azureConatiner.Object);
            ClassContainer.RegisterInstance(publishActivityEvents.Object);

            var target = new DocumentApi();
            target.UpdateModel(activityId, documentRequest);

            FlattenedDocumentModel expectedModel = new FlattenedDocumentModel(activity, documentRequest);
            var expectedMetadata = JsonConvert.SerializeObject(expectedModel);

            azureConatiner.Verify(a => a.ActivitySearch(string.Empty, queryString), Times.Once());
            publishActivityEvents.Verify(p => p.PublishDocumentMetadata(expectedMetadata, activity.RootName, expectedModel.MetadataFileName));
        }


Этот тест проверяет, что внутренние компоненты метода void выполняют ожидаемые вызовы с ожидаемыми значениями и ожидаемым количеством раз.(Я хотел бы отметить, что этот образец является НЗП и имеет некоторые проблемы, которые нуждаются в дальнейших тестах, например activityModel является нулевым).