Arhn - архитектура программирования

Как проверить количество звонков методом «этой» услуги

Я использую NUnit framework с moq для тестирования. У меня проблема с проверкой того, сколько раз был вызван частный метод этого класса. Для этого с mock-объектом достаточно вызвать Verify() с параметрами типа Times, но мой метод является частью этого класса. Я пытался издеваться над текущей службой (SUT), но, вероятно, это не лучшая идея, и она не работает должным образом.

СУТ:

public object Post(Operations.Campaign.Merge request)
{
    List<CampaignIdWithNumberOfAds> campaignList = new List<CampaignIdWithNumberOfAds>();

        for (int i = 0; i < request.CampaignIdsToMerge.Count; i++)
        {
            if (this.CampaignRepository.Exist(request.CampaignIdsToMerge[i]))
            {
                campaignList.Add(new CampaignIdWithNumberOfAds()
                {
                    CampaignId = request.CampaignIdsToMerge[i],
                    NumberOfAdvertisement = this.CampaignRepository.GetNumberOfAdvertisementsInCampaign(request.CampaignIdsToMerge[i])
                });
            }
        }

        if (campaignList.Count > 1)
        {
            campaignList = campaignList.OrderByDescending(p => (p == null) ? -1 : p.NumberOfAdvertisement).ToList();
            List<CampaignIdWithNumberOfAds> campaignsToMerge = campaignList.Skip(1).ToList();
            CampaignIdWithNumberOfAds chosenCampaign = campaignList.FirstOrDefault<CampaignIdWithNumberOfAds>();

            uint chosenCampaignId = chosenCampaign.CampaignId;

            foreach (var campaignToMerge in campaignsToMerge)
            {
                this.MergeCampaigns(chosenCampaignId, campaignToMerge.CampaignId);
            }
        }

        return true;
    }

Тестовое задание:

    [Test]
    public void MergeCampaignsPost_ValidMergeCampaignsRequest_ExecuteMergeCampaignsMethodAppropriateNumberOfTimes() 
    {
        // Arrange
        var mockCampaignService = new Mock<Toucan.Api.Services.CampaignService>();
        var request = Mother.GetValidMergeCampaignsRequest_WithDifferentNumbersOfAdvertisement();
        mockCampaignService.Setup(x => x.MergeCampaigns(It.IsAny<uint>(), It.IsAny<uint>()));

        // Act
        var response = this.Service.Post(request);

        // Assert
        mockCampaignService.Verify(x => x.MergeCampaigns(It.IsAny<uint>(), It.IsAny<uint>()), Times.Exactly(request.CampaignIdsToMerge.Count - 1));
    }
22.04.2015

Ответы:


1

Боюсь, что я не дам вам решения здесь, хотя я бы скорее предложил вам какое-то руководство. Существует множество различных стратегий модульного тестирования, и разные люди предлагают разные решения. В основном, на мой взгляд, вы можете изменить способ тестирования своего кода (вы можете согласиться или не согласиться с этим, но, пожалуйста, примите это во внимание).


  • Модульный тест не должен зависеть от реализации

Как бы просто это ни звучало, очень трудно придерживаться такого подхода. Приватные методы — это ваша реализация решения задачи. Типичная ловушка для разработчика, пишущего модульный тест для своего собственного кода, заключается в том, что вы знаете, как работает ваш код, и отражаете его в модульном тесте. Что, если реализация изменится, но публичный метод по-прежнему будет выполнять запрошенный контракт? Вряд ли вы когда-нибудь захотите напрямую тестировать модуль с помощью частного метода. Это связано со следующим...

  • Тест должен проверять результат вывода метода

Что в основном означает, что не нужно проверять, сколько раз что-то выполняется, если вам это не нужно. Я не уверен, что делает ваш метод MergeCampaigns, но было бы лучше, если бы вы проверяли результат операции, а не то, сколько раз она выполняется.

  • Не переусердствуйте со своими модульными тестами — обеспечивайте удобство сопровождения

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


Очень легко начать писать модульные тесты и поддерживать зеленый цвет покрытия, но становится очень сложно, если вы хотите написать хорошие модульные тесты. Есть много ценных ресурсов, которые помогут вам в этом. Удачи!

22.04.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..