Как обеспечить свойства для объектов пророчеств PHPUnit?

Я издеваюсь над API с Пророчеством.

Вызов объекта API для payments() вернет объект, который имеет get($id) метод, который возвращает другой объект, который имеет несколько методов и свойств. Одним из свойств является ID, и я хочу проверить, что это то, что я ожидаю.

Без насмешек, используя живой API, это может сработать:

$payment = $api->payments()->get(12345);
$this->assertEquals(12345, $payment->id);

Чтобы издеваться над API, я настраиваю его так:

$mock_payment = $this->prophesize('Api\\Resources\\Payment');

$mock_payments = $this->prophesize('Api\\Services\\PaymentsService');
$mock_payments->get(12345)->willReturn($mock_payment->reveal());

$api = $this->prophesize('Api');
$api->payments()->willReturn($mock_payments->reveal());

// Now the test code from above:
$payment = $api->payments()->get(12345);
$this->assertEquals(12345, $payment->id)

Однако я не могу понять, как дать reveal()макет платежного объекта публичного свойства идентификатора и как установить для него переданный идентификатор (12345)?

Изменить: упрощение вопроса.

У меня есть сторонний API, который я не могу изменить и не хочу тестировать. Он возвращает экземпляры определенных классов объектов с данными, доступными через сочетание открытых свойств и методов получения.

SUT:

function doSomething($api) {
  $result = $api->getResult();
  return "Born: $result->born, " . $result->getAge() . " years old.";
}

Я хочу проверить:

function testDoSomething() {
   // ...mock the $api so that getResult() returns an object like the 
   // expected one which has a born property set to "1 April 2016" and a 
   // and a getAge method that will return "1".
   // ...
   $result = doSomething($api);
   $this->assertEquals("Born: 1 April 2016, 1 years old.");
}

1 ответ

Я полагаю, что вы забыли раскрыть пророчество API.

        $mock_payment = $this->prophesize (Payment::class);

        // ---- HERE -----------------
        $mock_payment->id = 12345;
        // ---------------------------
        $mock_payment->get()->willReturn (1);

        $mock_payments = $this->prophesize (PaymentsService::class);
        $mock_payments->get (12345)->willReturn ($mock_payment->reveal ());

        $api = $this->prophesize (Api::class);
        $api->payments ()->willReturn ($mock_payments->reveal ());

        // ---- AND HERE -------------
        $api = $api->reveal();
        // ---------------------------

        $payment = $api->payments ()->get (12345);
        $this->assertEquals (12345, $payment->id);
Другие вопросы по тегам