@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
.
@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()
.
@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 был вызван с ожидаемыми аргументами.