Ответы пользователя по тегу PHPUnit
  • Laravel. Как тестировать кэширование?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Класс, который реализует эту логику принимает объект работы с БД и объект работы с кэшем в качестве зависимостей.
    В тесте вы вместо зависимостей передаёте моки и описываете для них требования по вызванным методам.
    Всё - в проекте хорошая архитектура, тесты писать легко и приятно.
    Ответ написан
    Комментировать
  • Как тестировать компоненты Laravel 5 с PhpUnit 9, при использовании orchestra/testbench или аналогичного пакета?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Ну, вы можете сделать форк и руками реализовать совместимость с нужной версией. Понятно, что для древних инкарнаций фреймворка никто этим не занимается в промышленных масштабах.
    Ответ написан
  • Как работают Юнит тесты?

    Ошибка в том, что вы в контроллере передаёте строку вторым аргументом?
    Если да, то это отловит тест контроллера, а не метода findAll, тот тест никакой магией не узнает, что вы будете передавать в каком-то другом месте невалидные аргументы.
    Ответ написан
    Комментировать
  • Почему PHPunit не видит тесты?

    PhpUnit по умолчанию ищет файлы с суффиксом Test.php. У вас файл имеет суффикс TestCase.php - такие классы вообще не должны тестов содержать, там вспомогательный код лежит обычно.
    Ответ написан
    Комментировать
  • Как протестировать метод, который вызывает методы другого класса?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    class MyTest extends \PHPUnit\Framework\TestCase
    {
        public function testDoSomethingOne(): void
        {
            /** @var \PHPUnit\Framework\MockObject\MockObject $mockOfA */
            $mockOfA = $this->getMockBuilder(A::class)->getMock();
    
            $mockOfA->expects($this->once())
                ->method('setData')
                ->with(20);
    
            (new B)->doSomething($mockOfA, 1);
        }
    
        public function testDoSomethingTwo(): void
        {
            /** @var \PHPUnit\Framework\MockObject\MockObject $mockOfA */
            $mockOfA = $this->getMockBuilder(A::class)->getMock();
    
            $mockOfA->expects($this->once())
                ->method('setData')
                ->with(10000);
    
            (new B)->doSomething($mockOfA, 100);
        }
    }


    The practice of replacing an object with a test double that verifies expectations, for instance asserting that a method has been called, is referred to as mocking.

    https://phpunit.de/manual/6.5/en/test-doubles.html
    Ответ написан
    2 комментария
  • Как Mock PHPUnit связанные модели в Laravel?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    $test1->type_status()->attach($types);
    Ответ написан
    Комментировать
  • В чем суть автотестов с PHPUnit на примере формы?

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

    Тесты часто пишутся до кода и являются прекрасной возможностью продумать граничные случаи заранее. Когда вы пишете код, вы думаете об "удачной" ветке выполнения - как сделать, чтобы функционал заработал. Когда вы пишете тесты, вы наоборот идёте по "пессимистичной" ветке - что может пойти не так во время выполнения? В первом случае легко что-то забыть, потому что голова уже занята деталями реализации.

    Кроме того, если писать сначала тесты, а потом код, будет улучшаться архитектура (в теории, разумеется). Покрывать тестами код с кривой архитектурой очень-очень больно, поэтому из чистой лени вы будете стараться следовать всяким SOLID'ам, KISS'ам, YAGNI и прочим акронимам.

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

    Это, что касается тестов в целом. Конкретно пример из вопроса лишён смысла, поскольку а) нет никакого смысла писать свой слой работы с БД, когда есть много готовых удобных и протестированных инструментов и б) то, что вы описали, не юнит-тест (ну или как минимум несколько юнит-тестов).
    Ответ написан
    6 комментариев
  • Как вы пишите тестируемый код?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Для решения этой проблемы и придумали Dependency Injection и IoC-контейнер.
    Ответ написан
    Комментировать