Как проверить взаимодействие с внешними зависимостями в PHPSpec?

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

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

Как проверить взаимодействие с внешними зависимостями в PHPSpec?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

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

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

@jorge 

В PHPSpec проверка взаимодействия с внешними зависимостями выполняется с помощью спецификаций (Specifications) и моков (Mocks).


Для проверки взаимодействия с внешними зависимостями в PHPSpec, вы можете использовать следующие шаги:

  1. Создайте спецификацию для тестируемого класса или метода. Например:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class MyServiceSpec extends ObjectBehavior
{
    function it_calls_method_on_external_dependency()
    {
        // arrange
        $dependency = $this->getDependencyMock();
        $this->beConstructedWith($dependency);
        
        // act
        $this->performAction();
        
        // assert
        $dependency->method()->shouldBeCalled();
    }
}


  1. В пределах спецификации, создайте мок внешней зависимости для проверки взаимодействия с ней. В этом примере используется метод getDependencyMock(), который создает мок внешней зависимости:
1
2
3
4
5
6
7
8
private function getDependencyMock()
{
    $dependency = $this->prophesize(ExternalDependency::class);
    
    // здесь могут быть установлены ожидания на методы внешней зависимости
    
    return $dependency->reveal();
}


  1. В методе getDependencyMock(), вы можете установить ожидания на методы внешней зависимости, если это необходимо для проверки взаимодействия. Например:
1
2
3
4
5
6
7
8
private function getDependencyMock()
{
    $dependency = $this->prophesize(ExternalDependency::class);
    
    $dependency->method()->shouldBeCalled();
    
    return $dependency->reveal();
}


  1. Запустите тесты используя PHPSpec командой vendor/bin/phpspec run, и PHPSpec проверит взаимодействие с внешней зависимостью, основываясь на определенных ожиданиях.


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


Ожидание shouldBeCalled() необходимо добавлять только в том случае, если взаимодействие с внешней зависимостью должно произойти. Если взаимодействие не должно происходить, можно использовать ожидание shouldNotBeCalled().

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

от nicolette.stoltenberg , 4 месяца назад

@jorge 

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

  1. Установите зависимости PHPUnit и Prophecy в свой проект через Composer, если они еще не установлены:
1
composer require --dev phpunit/phpunit phpspec/prophecy


  1. Импортируйте классы Prophecy в вашу спецификацию, чтобы использовать их для создания моков:
1
2
use ProphecyPhpSpecProphecyTrait;
use ProphecyProphecyObjectProphecy;


  1. Создайте мок соответствующей зависимости внутри вашей спецификации:
1
2
3
4
$externalDependencyMock = $this->prophesize(ExternalDependency::class);
$externalDependency = $externalDependencyMock->reveal();

// Далее, можно установить ожидания на методы этого мока, если это необходимо


  1. Используйте созданный мок в вашем объекте класса перед его использованием:
1
$this->beConstructedWith($externalDependency);


  1. Проверьте ожидания взаимодействия с внешней зависимостью в вашей спецификации:
1
$externalDependencyMock->method()->shouldBeCalled();


  1. Запустите тесты для вашей спецификации и убедитесь, что взаимодействие с внешней зависимостью соответствует установленным ожиданиям.


Эти шаги помогут вам проверить взаимодействие вашего кода с внешними зависимостями в PHPSpec.

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

от marshall.cummings , 4 месяца назад

@jorge 

Отличные дополнения к предыдущему ответу! Все эти шаги помогут вам эффективно проверить взаимодействие с внешними зависимостями в PHPSpec, используя моки и ожидания. Убедитесь, что ваш код взаимодействует с внешними зависимостями корректно и соответствует вашим ожиданиям в ходе тестирования.