Nano Hash - криптовалюты, майнинг, программирование

Как я могу протестировать контроллер Symfony2?

Я хочу максимально использовать разработку через тестирование — это отличный способ работы.

Меня беспокоит тот факт, что контроллеры Symfony2 создают и возвращают новый объект Response.

Я хочу иметь возможность проводить модульное тестирование контроллера изолированно.

Как ты это делаешь?

Является ли ответ созданием контроллера как простого старого PHP-объекта, его регистрацией в качестве службы и использованием внедрения зависимостей для передачи в него нового объекта Response (или фабрики Response)?

12.04.2012

  • В чем проблема с возвратом объекта Response? 12.04.2012
  • Ничего такого. Мне просто не нравится тот факт, что объект Response создается в контроллере. Я твердо верю в внедрение зависимостей и ненавижу видеть новое ключевое слово в чем-либо, кроме контейнера внедрения зависимостей. Возможно, это убеждение ошибочно. 15.04.2012

Ответы:


1

Обычно ваш контроллер объединяет разные объекты и соединяет их в правильном порядке. Может он вызывает репозиторий, читает какие-то объекты и возвращает их через метод рендера. Может быть, он звонит другим хендлерам/менеджерам, которые занимаются этим.

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

Я также хотел бы отметить, что TDD не означает, что все должно подвергаться модульному тестированию. Можно провести несколько функциональных тестов высокоуровневого кода. Как уже говорилось, если вы тестируете низкоуровневые компоненты с помощью модульных тестов, вы должны проверять только то, как они работают вместе, что вы не можете протестировать с помощью макетов, потому что вы сообщаете макетам, что такое возвращаемое значение.

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

Поэтому я предлагаю использовать функциональные тесты для тестирования ваших контроллеров и использовать модульные тесты для тестирования ваших моделей и вашей бизнес-логики.

Если вы боретесь с функциональными тестами, вы можете прочитать следующее:

12.04.2012
  • Хорошо. Я думал, что, поскольку контроллер был классом, его тоже нужно было тестировать. Мне не нравится идея писать код перед написанием тестов, поэтому мне было интересно, есть ли способ реорганизовать способ использования контроллеров, чтобы иметь возможность их модульного тестирования. Думаю, я все еще могу работать с TDD, написав функциональные тесты до того, как напишу контроллер. 15.04.2012

  • 2

    Используйте макеты, чтобы изолировать модели и другие объекты от логики основного метода контроллера, см. http://www.phpunit.de/manual/3.7/en/test-doubles.html#test-doubles.mock-objects

    Я думаю, что в более старых версиях вы могли издеваться над всем классом, но с последней версией phpunit 3.6.10, которая у меня есть, это не работает. Итак, я думаю, у вас остался шаблон инъекции зависимостей

    class objss{
        function ss(){
            $x = new zz();
            var_dump($x->z());
        }
    }
    
    
    
    class MoTest extends PHPUnit_Framework_TestCase{
        public function setUp(){
    
        }
    
        public function testA(){
            $class = $this->getMock('zzMock', array('z'), array(), 'zz');
            $class->expects($this->any())->method('z')->will($this->returnValue('2'));
    
            $obj = new objss();
            $this->assertEquals('2', $obj->ss());
        }
    }
    
    12.04.2012
  • Полностью, но эти объекты (включая объект Response) будут созданы в контроллере. Если я не использую контейнер DI для предоставления моделей и других вещей для контроллеров. Возможно, я мог бы создать службу фабрики Response и получить ее из контейнера DI - таким образом ее (контейнер DI и фабрику) можно было бы смоделировать для изолированного тестирования класса Controller. 12.04.2012

  • 3

    Модульное тестирование

    Преобразуйте ваши контроллеры в сервисы: http://symfony.com/doc/current/cookbook/controller/service.html

    Затем вы можете легко протестировать их.

    Функциональное тестирование

    Конечно (как уже упоминалось другими) вы можете использовать WebTestCase, как описано здесь: http://symfony.com/doc/current/book/testing.html#functional-tests

    30.01.2015
  • Symfony официально не рекомендует определять контроллеры как сервисы. Они используются некоторыми разработчиками для очень специфических вариантов использования, таких как DDD (проектирование, управляемое предметной областью) и приложения с гексагональной архитектурой. 01.02.2017
  • Кто так говорит? symfony.com/doc/current/controller/service.html Перевешивает профессионал афера в их собственной документации. Я совершенно уверен, что контроллеры как сервисы будут поддерживаться в будущих версиях symfony, так что я бы не слишком беспокоился о том, что это официально не рекомендуется. 07.02.2017

  • 4

    Льюис – Я решил прыгнуть сюда. Приведенный выше подход позволяет вам воспроизвести лучшую часть логики ваших действий в ваших тестах. В этом нет ничего плохого, многие фреймворки (особенно RSPEC в Rails) на самом деле предлагают вам выполнять как модульные тесты на ваших объектах контроллера, так и функциональные тесты. Однако, учитывая ваш пример, я думаю, что пропущу модульный тест и выберу функциональный подход.

    Смысл теста, на мой взгляд, состоит в том, чтобы создать изолированную среду, запустить тест и проверить наличие побочных эффектов и прямого результата. Если вы дойдете до того, что большая часть вашего теста изолирует метод, то, вероятно, пришло время либо для другого подхода к тестированию, либо для другого подхода к написанию вашего класса. Учитывая, что это контроллер, и по своей природе они склеивают разные части стека, я бы создал вашу песочницу выше по стеку. В частности, я бы использовал такой подход:

    https://github.com/PolishSymfonyCommunity/SymfonyMockerContainer

    Отлично сработало для меня :)

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..