Как называется этот шаблон и как его следует тестировать? - PullRequest
2 голосов
/ 03 апреля 2012

Вкратце: как шаблон называется в следующем коде и как его следует тестировать?

Цель кода - инкапсулировать ряд действий в zip-файле (написанном на C #,хотя шаблон не зависит от языка):

public class ZipProcessor
{
    public ZipProcessor(string zipFilePath) { ... }

    public void Process()
    {
        this.ExtractZip();
        this.StepOne();
        this.StepTwo();
        this.StepThree();
        this.CompressZip();
    }

    private void ExtractZip() { ... }
    private void CompressZip() { ... }
    private void StepOne() { ... }
    private void StepTwo() { ... }
    private void StepThree() { ... }
}

Фактический класс имеет около 6 шагов, и каждый шаг является коротким методом, длиной 5-15 строк.Порядок шагов не важен, но Extract и Compress всегда должны идти первым и последним соответственно.Кроме того, StepTwo выполняется намного дольше, чем остальные шаги.

Ниже приведены варианты, которые я могу придумать для тестирования класса:

  • Вызывать только публичные Process метод, и проверять результат только одного шага в каждом методе тестирования ( pro : чистый, con : медленный, потому что каждый метод теста вызывает StepTwo, что является медленным,даже если его не волнует результат StepTwo)
  • Протестируйте приватные шаги напрямую, используя аксессор или оболочку ( pro : простое, ясное отношение к тому, что запускается во времяtest и то, что на самом деле проверяется, con : все еще медленно: извлекает и сжимает несколько раз, hacky: нужно использовать частный метод доступа или динамическую оболочку или выполнить шаги internal для доступа к ним)
  • Иметь только один метод тестирования, который вызывает несколько меньших вспомогательных методов тестирования ( pro : быстро, моделирует класс более тесно, con : нарушает "одно утверждение за тест"метод ", все равно нужно запускать несколько раздля разных сценариев, напр.StepOne имеет различное поведение в зависимости от ввода)

Ответы [ 4 ]

1 голос
/ 17 сентября 2015

Я немного опоздал к обсуждению, но это метод сержанта.

Быстрый гугл возвращает "Мы называем большой метод здесь как метод" сержант ", который в основном вызывает другие частные методы и маршалинг их. Он может иметь кусочки кода здесь и там. Каждый из этих частных методовоб одной конкретной вещи. Это способствует сплоченности и делает метод сержанта читать как комментарии ".

Что касается того, как вы можете проверить это - ваш пример предположительно нарушает SRP, потому что у вас есть Zip-компрессор / декомпрессор (одна вещь) изатем шаг 1/2.Вы можете извлечь вызовы закрытых методов в другие классы и смоделировать их для своего теста.

Я не согласен с тем, что здесь Chain-of-Responsibility имеет большой смысл - компрессору не нужно знать о декомпрессоре (если ониВы тот же класс) или причина, по которой он делает декомпрессию.Классы обработки (Шаг 1/2/3) не должны заботиться о том, чтобы данные, с которыми они работают, сжимались ранее и т. Д.

Шаблон стратегии тоже не имеет смысла - просто потому, что вы можете поменяться местами.реализация extractZip или compressZip не означает, что у вас есть шаблон стратегии.

1 голос
/ 03 апреля 2012

Здесь на самом деле не отражен шаблон, но вы могли бы переписать свой код, чтобы использовать шаблоны «Стратегия» или «Цепочка ответственности», как указал Пол Михалик.Как правило, у вас просто есть собственный рабочий процесс, определенный для нужд вашего приложения.Используя шаблон Chain of Responsibility, каждый шаг будет представлять собой свой собственный класс, который вы можете протестировать независимо.Затем вы можете захотеть написать интеграционный тест, который обеспечит непрерывную работу всего процесса (тест на уровне компонентов или приемочного уровня).

0 голосов
/ 03 апреля 2012

Это Стратегия . В зависимости от сценария тестирования вы можете извлечь из ProcessorMock (или реализовать его, если он является интерфейсом) и переопределить методы, не относящиеся к тестированию соответствующими заглушками. Однако, как правило, более гибкая схема для таких случаев составляет Цепочка ответственности ...

0 голосов
/ 03 апреля 2012

Подумайте о том, чтобы разделить его на 2+ класса - ExtractZip / Compress и process или 1 класс ExtractZip / Compress с делегатом посередине.

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