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