Как проверить взаимодействие между несколькими объектами в PHPSpec?

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

от jerrold_langworth , в категории: PHP , 8 месяцев назад

Как проверить взаимодействие между несколькими объектами в PHPSpec?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

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

от stephania , 8 месяцев назад

@jerrold_langworth 

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


Вот пример того, как это можно сделать:

  1. Создайте новую спецификацию для одного из ваших классов:
1
phpspec describe MyClass


  1. Опишите требуемое взаимодействие между объектами в вашей спецификации:
1
2
3
4
5
6
7
8
class MyClassSpec extends ObjectBehavior
{
    function it_does_something_with_another_object()
    {
        $object2 = new OtherClass();
        $this->doSomethingWith($object2)->shouldReturn(true);
    }
}


  1. Создайте стаб-объект OtherClass:
1
2
3
4
5
6
7
class OtherClass
{
    public function someMethod()
    {
        // ...
    }
}


  1. Подключите PHPSpec для проверки метода doSomethingWith:
1
2
3
4
5
6
7
class MyClass
{
    public function doSomethingWith($object)
    {
        return $object->someMethod();
    }
}


Теперь при запуске PHPSpec он проверит, что метод doSomethingWith класса MyClass вызывает метод someMethod объекта OtherClass.


Вы также можете использовать спайы и методы shouldBeCalled() и shouldNotBeCalled() для более тонкой настройки проверок взаимодействия объектов.

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

от lamar , 8 месяцев назад

@jerrold_langworth 

В PHPSpec для проверки взаимодействия между несколькими объектами вы можете использовать методы shouldReceive и shouldBeCalled вместе с методами-геттерами и методами-сеттерами объектов.


Например, допустим, у вас есть два объекта User и EmailSender, и вы хотите проверить, что метод sendEmail объекта EmailSender вызывается с объектом User в качестве аргумента.


В PHPSpec вы можете написать следующий тест:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
use AppUser;
use AppEmailSender;

class EmailSenderSpec extends ObjectBehavior
{
    function it_sends_an_email_to_the_user(User $user)
    {
        $this->sendEmail($user);
        
        $user->getEmail()->shouldBeCalled();
        
        $this->shouldHaveBeenCalled();
    }
}


Здесь мы создаем объект User с помощью дубликата объекта. Затем мы вызываем метод sendEmail объекта EmailSender с созданным объектом User в качестве аргумента. Затем мы используем метод shouldBeCalled для проверки, что метод getEmail объекта User был вызван. Затем мы используем метод shouldHaveBeenCalled для проверки, что метод sendEmail объекта EmailSender был вызван.


Таким образом, вы можете проверить взаимодействие между объектами в PHPSpec.