Как создать тестовый двойник (test double) с помощью PHPUnit?

Пользователь

от jensen , в категории: PHP , год назад

Как создать тестовый двойник (test double) с помощью PHPUnit?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

Пользователь

от terrence , год назад

@jensen 

PHPUnit предоставляет несколько способов создания тестовых двойников. Один из наиболее распространенных способов - использование "моков" (mock) и "фейков" (fake).


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


Пример создания мока с помощью PHPUnit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
use PHPUnitFrameworkTestCase;

class MyTest extends TestCase
{
    public function testSomething()
    {
        // Создаем мок объекта SomeClass
        $mock = $this->getMockBuilder(SomeClass::class)
                     ->getMock();

        // Настраиваем мок, чтобы он возвращал определенное значение при вызове определенного метода
        $mock->method('someMethod')
             ->willReturn('someValue');

        // Выполняем тестирование
        $result = $mock->someMethod();

        // Проверяем, что метод был вызван
        $this->assertEquals('someValue', $result);
    }
}


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


Пример создания фейка с помощью PHPUnit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
use PHPUnitFrameworkTestCase;

class MyTest extends TestCase
{
    public function testSomething()
    {
        // Создаем фейк объекта SomeClass
        $fake = $this->getMockBuilder(SomeClass::class)
                     ->getMockForAbstractClass();

        // Настраиваем фейк, чтобы он возвращал определенное значение при вызове определенного метода
        $fake->method('someMethod')
             ->willReturn('someValue');

        // Выполняем тестирование
        $result = $fake->someMethod();

        // Проверяем, что метод вернул ожидаемое значение
        $this->assertEquals('someValue', $result);
    }
}


Это простейшие примеры создания моков и фейков с помощью PHPUnit. В реальной разработке может понадобиться настраивать больше параметров и поведения объектов. Для более сложной конфигурации моков и фейков можно использовать методы PHPUnit, такие как willReturnCallback(), with() и другие.

Пользователь

от guillermo , 4 месяца назад

@jensen 

PHPUnit предоставляет множество возможностей для создания тестовых двойников: моков, фейков, стабов и шпионов. Вот несколько примеров использования этих возможностей:

  1. Mock объект:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
use PHPUnitFrameworkTestCase;

class MyTest extends TestCase
{
    public function testSomething()
    {
        // Создание мока объекта SomeClass
        $mock = $this->createMock(SomeClass::class);

        // Установка ожиданий и возвращаемых значений
        $mock->method('someMethod')
             ->willReturn('someValue');

        // Вызов метода
        $result = $mock->someMethod();

        // Проверка ожидаемого результата
        $this->assertEquals('someValue', $result);
    }
}


  1. Fake объект:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
use PHPUnitFrameworkTestCase;

class MyTest extends TestCase
{
    public function testSomething()
    {
        // Создание фейк объекта SomeClass
        $fake = $this->getMockBuilder(SomeClass::class)
                     ->getMockForAbstractClass();

        // Установка возвращаемого значения
        $fake->method('someMethod')
             ->willReturn('someValue');

        // Вызов метода
        $result = $fake->someMethod();

        // Проверка ожидаемого результата
        $this->assertEquals('someValue', $result);
    }
}


Это лишь примеры использования моков и фейков. Для создания стабов и шпионов в PHPUnit также есть соответствующие методы (createStub() и createSpy()). Подробнее о создании и настройке тестовых двойников в PHPUnit можно узнать из документации библиотеки: https://phpunit.de/documentation.html.

Пользователь

от ottilie.farrell , 4 месяца назад

@jensen 

Спасибо! Моя ошибка. Вот пример использования стаба и шпиона с помощью PHPUnit:


Стаб объект:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
use PHPUnitFrameworkTestCase;

class MyTest extends TestCase
{
    public function testSomething()
    {
        // Создание стаба объекта SomeClass
        $stub = $this->createStub(SomeClass::class);

        // Установка возвращаемого значения
        $stub->method('someMethod')
             ->willReturn('someValue');

        // Вызов метода
        $result = $stub->someMethod();

        // Проверка ожидаемого результата
        $this->assertEquals('someValue', $result);
    }
}


Шпион:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use PHPUnitFrameworkTestCase;

class MyTest extends TestCase
{
    public function testSomething()
    {
        // Создание шпиона объекта SomeClass
        $spy = $this->getMockBuilder(SomeClass::class)
                     ->enableProxyingToOriginalMethods()
                     ->getMock();

        // Установка ожиданий вызовов методов
        $spy->expects($this->once())
            ->method('someMethod')
            ->willReturn('someValue');

        // Вызов метода
        $result = $spy->someMethod();

        // Проверка ожидаемого результата
        $this->assertEquals('someValue', $result);
    }
}


Таким образом, PHPUnit предоставляет различные методы для создания и настройки различных типов тестовых двойников: моков, фейков, стабов и шпионов. Каждый из этих типов тестовых двойников имеет свои особенности и применяется в различных ситуациях в зависимости от потребностей тестирования.