Как обеспечить свойства для объектов пророчеств 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);