Издевательский метод «с» не показывает, почему терпит неудачу - PullRequest
0 голосов
/ 26 февраля 2020

Я использую метод with на макете, чтобы утверждать, что метод вызывается с объектом в качестве аргумента

        Mockery::mock(PaymentRepository::class)
             ->shouldReceive('removeTripPayments')
             ->with($trip)
             ->mock();

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

1) PaymentServiceTest::test_removing_payments
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_0_PaymentRepository::removeTripPayments(object(Trip)). Either the method was unexpected or its arguments matched no expected argument list for this method

Objects: ( array (
  'MyNamespace\Trip' =>
  array (
    'class' => 'MyNamespace\\Trip',
    'properties' =>
    array (
    ),
  ),
))

1 Ответ

1 голос
/ 13 апреля 2020

Когда вы передаете объект методу в качестве аргумента, который в данном случае вы передаете объект (Trip), тогда PHPUnit сходит с ума. У меня всегда была эта проблема, и у вас есть два решения, первое с использованием Mockery :: on ();

->with(Mockery::on(function($Param){
    $this->assertEqual(get_class($Param), get_class(Trip));
    return true;
}))

Как вы можете видеть, PHPUnit не может полностью сравнить два объекта, поэтому вы нужно сравнить часть объектов, которые в этом случае я использовал get_clas для проверки имени классов. И второе решение может использовать

->andReturnUsing(function($param){
   $this->assertEqual(get_class($Param), get_class(Trip));
   return true; // Expected response
});

Может быть, это может быть полезно для вас.

...