(PHP) Модульное тестирование с внедрением зависимостей (DI)

#php #dependency-injection #phpunit

#php #внедрение зависимостей #phpunit

Вопрос:

За последние несколько дней я много читал о внедрении зависимостей. Теперь, поскольку я пытаюсь улучшить свои навыки phpunit, я думал, как реализовать этот DI. в моих модульных тестах.

Допустим, у меня есть два объекта:

 class Event{
}

class Shift{
    public function __construct(Event $e)
    {
        (...)
    }
}
  

Вот как я по сути понимаю DI.
Теперь я хочу написать тест для моего конструктора shift:

 class ShiftTest extends
    ModelTestCase
{
    public function testCanCreateShift()
    {
        $e = new JsEntityEvent();
        $this->assertInstanceOf('JSEntityShift', new JSEntityShift($e));
    }
}
  

Но теперь я не хочу определять здесь полный объект события. Итак, каков рекомендуемый способ создания моего объекта event в PHPUnit?

Комментарии:

1.(ссылка) phpunit.de/manual/current/en/test-doubles.html

Ответ №1:

Для этого используются mocks, stubs. etc. Вы создаете SUT (тестируемую систему) и моделируете все зависимости. Вы не смогли бы сделать это без DI в первую очередь.

Комментарии:

1. Но должен ли я использовать заглушку или макет?

2. Самое большое отличие заключается в том, что заглушки состояния теста (т. Е. После того, как я сделаю x, состояние y будет z) и имитирует поведение теста (т. Е., Если я сделаю x, произойдет y). Это потрясающая статья на эту тему: martinfowler.com/articles/mocksArentStubs.html