2017-01-18 12 views
2

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

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 вернуться верно.

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

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

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

+0

Я думаю, Объект PhoneBook должен передаваться по ссылке на 'Customer_Account :: __ construct()', чтобы он мог ork, но не на 100%. – segFault

+2

change '-> setMethods (null)' to '-> setMethods (array ('getDetails'))' при создании '$ phone_book_mock' – xmike

ответ

0

Это должно работать, чтобы утверждать, что 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 
    ); 
} 

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