PHPUnit передает фиктивный объект в качестве аргумента в конструктор другого объекта и использует метод Expected ()

Я пытаюсь утверждать, что метод объекта (тестируемого объекта) вызывается хотя бы один раз при создании другого объекта. Я хочу использовать функцию Expect () phpunit, чтобы проверить, что вызывается метод getDetails (). Эта функция вызывается при создании другого объекта учетной записи клиента. Я, должно быть, упускаю что-то фундаментальное из того, как работает phpunit, но, возможно, я подхожу к проблеме с мышлением Python. Я знаю, я мог бы заставить это работать в Python, но, возможно, это не возможно здесь?
Вот мой тестовый код:

public function testPhoneBookCode()
{
$account = 'testaccount';

$phone_book_mock = $this->getMockBuilder('\corp\data\PhoneBook')
->setConstructorArgs(array(null))
->setMethods(null)
->getMock();

$expected = array(
'id' => 1234,
'title' => 'Mr',
'first_name' => 'George',
'last_name' => 'Smith',
'phone' => '111-111-1111'
);

$phone_book_mock->expects($this->atLeastOnce())
->method('getDetails')
->with($this->equalTo(1234))
->will($this->returnValue($expected));

try {
$c = new Customer_Account(
$account,
true,
'acme_corp',
1234,
null,
null,
$phone_book_mock
);

} catch ( \Exception $e ) {
$this->fail("An unexpected exception has been raised [$account].". $e);
}
}

В этот момент я ожидаю, что создание экземпляра класса Customer_Account вызовет метод getDetails на моем макете, а проверка atLeastOnce вернет true.

Этот код модифицирован из примера из реальной жизни. Таким образом, любые опечатки могут быть введены при повторном наборе. В реальном коде «phone_book» передается в конструктор объекта Customer_Account, и в этом конструкторе вызывается метод getDetails (). Я подтвердил, что метод действительно вызывается, и я получаю ожидаемое возвращаемое значение. Тем не менее, мой фиктивный ожидает () тест не удается.

Ожидание не удалось для имени метода равно, когда вызывается по крайней мере один раз.
Ожидаемый вызов хотя бы один раз, но он никогда не происходил.

Макет не регистрирует вызов getDetails (), хотя я уверен, что вызывается правильный код. То, что я пытаюсь сделать, просто невозможно? Потеряю ли я ссылку на фиктивный объект после того, как передам его другому конструктору? Есть ли другой способ сделать это? Любая помощь будет принята с благодарностью.

3

Решение

Это должно работать, чтобы утверждать, что PhoneBook::details() вызывается с $id когда вы создаете экземпляр Customer_Account:

public function testPhoneBookCode()
{
$id = 1234;

$details = [
'id' => $id,
'title' => 'Mr',
'first_name' => 'George',
'last_name' => 'Smith',
'phone' => '111-111-1111'
];

$phoneBook = $this->createMock('corp\data\PhoneBook');

$phoneBook
->expects($this->atLeastOnce())
->method('getDetails')
->with($this->identicalTo($id))
->willReturn($details);

new Customer_Account(
'testaccount',
true,
'acme_corp',
$id,
null,
null,
$phoneBook
);
}

Для справки смотрите:

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector