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

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

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

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

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

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

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

@jaylen.trantow 

В PHPUnit можно использовать методы assertMethodHasNumberOfParameters() и assertMethodHasParameter() для проверки передачи аргументов при вызове метода.


Например, если у нас есть класс MyClass с методом myMethod, который принимает два аргумента, мы можем использовать следующий код в PHPUnit:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class MyClassTest extends PHPUnitFrameworkTestCase
{
    public function testMyMethod()
    {
        $reflectionClass = new ReflectionClass('MyClass');
        $reflectionMethod = $reflectionClass->getMethod('myMethod');

        // Проверяем, что метод myMethod имеет 2 аргумента
        $this->assertEquals(2, $reflectionMethod->getNumberOfParameters());

        // Проверяем, что первый аргумент метода myMethod имеет тип string
        $parameter1 = $reflectionMethod->getParameters()[0];
        $this->assertEquals('string', $parameter1->getType()->getName());

        // Проверяем, что второй аргумент метода myMethod имеет тип int
        $parameter2 = $reflectionMethod->getParameters()[1];
        $this->assertEquals('int', $parameter2->getType()->getName());
    }
}


PHPSpec также предоставляет аналогичные возможности для проверки передачи аргументов, но использует специфический синтаксис.


Вот пример, демонстрирующий проверку передачи аргументов при вызове метода с помощью PHPSpec:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class MyClassSpec extends ObjectBehavior
{
    function it_should_have_myMethod_with_2_arguments()
    {
        $reflectionMethod = new ReflectionMethod($this->getWrappedObject(), 'myMethod');

        // Проверяем, что метод myMethod имеет 2 аргумента
        $reflectionMethod->getNumberOfParameters()->shouldBe(2);

        // Проверяем, что первый аргумент метода myMethod имеет тип string
        $parameter1 = $reflectionMethod->getParameters()[0];
        $parameter1->getType()->getName()->shouldBe('string');

        // Проверяем, что второй аргумент метода myMethod имеет тип int
        $parameter2 = $reflectionMethod->getParameters()[1];
        $parameter2->getType()->getName()->shouldBe('int');
    }
}


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

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

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

@jaylen.trantow 

В PHPSpec можно проверить передачу аргументов при вызове метода с помощью метода shouldHaveBeenCalledWithArgs. Этот метод позволяет указать ожидаемые аргументы и проверить, был ли вызван метод с этими аргументами.


Пример использования:

1
2
3
$stub = $this->prophet->prophesize(MyClass::class);

$stub->myMethod('arg1', 'arg2')->shouldHaveBeenCalledWithArgs(['arg1', 'arg2']);


В этом примере мы создали заглушку ($stub) для класса MyClass с помощью метода prophesize. Затем мы вызвали метод myMethod с аргументами 'arg1' и 'arg2'. Затем мы использовали метод shouldHaveBeenCalledWithArgs для проверки, что метод myMethod был вызван с ожидаемыми аргументами.


Если метод был вызван с другими аргументами, PHPSpec выдаст ошибку. Если метод не был вызван совсем, также будет выдана ошибка.