Как проверить передачу аргументов при вызове метода на мок-объекте в PHPSpec?

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

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

Как проверить передачу аргументов при вызове метода на мок-объекте в PHPSpec?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

3 ответа

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

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

@yasmine 

В PHPSpec вы можете проверить передачу аргументов при вызове метода на мок-объекте с помощью метода shouldHaveBeenCalledWith.


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


Затем вызовите ожидаемый метод с аргументами на мок-объекте и проверьте передачу аргументов с помощью метода shouldHaveBeenCalledWith.


Вот пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use ProphecyPhpUnitProphecyTrait;
use PsrLogLoggerInterface;

class Foo
{
    private $logger;
    
    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function doSomething($arg1, $arg2)
    {
        $this->logger->info("Doing something with args $arg1 and $arg2");
    }
}

class FooSpec extends ObjectBehavior
{
    use ProphecyTrait;

    function it_should_do_something(LoggerInterface $logger)
    {
        $this->beConstructedWith($logger);

        $logger->info("Doing something with args foo and bar")->shouldBeCalled();
        
        $this->doSomething('foo', 'bar');
        
        $logger->info("Doing something with args foo and bar")->shouldHaveBeenCalledWith();
    }
}


В этом примере мы создали мок-объект $logger с помощью метода prophesize(LoggerInterface::class), вызвали ожидаемый метод info с аргументами "Doing something with args foo and bar" на мок-объекте, а затем проверили, что передача аргументов была выполнена правильно с помощью shouldHaveBeenCalledWith.

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

от craig.emmerich , 11 дней назад

@yasmine 

Важно отметить, что в коде представленном выше указан символ поддержки псевдонимов (Trait) use ProphecyPhpUnitProphecyTrait;. Однако, более актуальной и широко используемой библиотекой для создания мок-объектов в PHPSpec является Prophecy - это часть библиотеки PHPUnit. В недавних версиях PHPSpec с некоторыми адаптациями вы также можете использовать Prophecy для создания мок-объектов.


Вам также может понадобиться установить через composer пакеты phpspec/phpspec, phpspec/prophecy и phpspec/phpspec-prophecy, если вы используете старые версии PHPSpec.


Пример выше будет выглядеть следующим образом с использованием Prophecy и актуальных версий PHPSpec:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use ProphecyPhpUnitProphecyTrait;
use PsrLogLoggerInterface;

class Foo
{
    private $logger;
    
    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function doSomething($arg1, $arg2)
    {
        $this->logger->info("Doing something with args $arg1 and $arg2");
    }
}

class FooSpec extends ObjectBehavior
{
    use ProphecyTrait;

    function it_should_do_something(LoggerInterface $logger)
    {
        $this->beConstructedWith($logger);

        $logger->info("Doing something with args foo and bar")->shouldBeCalled();
        
        $this->doSomething('foo', 'bar');
        
        $logger->info("Doing something with args foo and bar")->shouldHaveBeenCalledWith();
    }
}


Этот пример демонстрирует создание мок-объекта $logger с помощью Prophecy, вызов ожидаемого метода info с определенными аргументами и проверку передачи этих аргументов с использованием метода shouldHaveBeenCalledWith().

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

от jose , 4 дня назад

@yasmine 

Вот еще один пример того, как можно проверить передачу аргументов при вызове метода на мок-объекте в PHPSpec с использованием Prophecy:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use ProphecyProphet;
use PsrLogLoggerInterface;

class Foo
{
    private $logger;
    
    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function doSomething($arg1, $arg2)
    {
        $this->logger->info("Doing something with args $arg1 and $arg2");
    }
}

describe('Foo', function() {
    $prophet = new Prophet();
    $logger = $prophet->prophesize(LoggerInterface::class);
    
    $subject = new Foo($logger->reveal());
    
    it('should call logger info with correct args', function() use ($logger, $subject) {
        $logger->info('Doing something with args foo and bar')->shouldBeCalled();
        
        $subject->doSomething('foo', 'bar');
        
        $logger->info('Doing something with args foo and bar')->shouldHaveBeenCalled();
    });
});


Здесь используется Prophet из Prophecy для создания мок-объекта $logger. Мы проверяем передачу аргументов при вызове метода info на этом мок-объекте в методе doSomething объекта Foo. После вызова метода проверяем, что метод info был вызван с ожидаемыми аргументами.