2017-02-09 8 views
2

Я пытаюсь написать тест, и один из моих методов использует глобальную функцию web(), которая принимает (строковый) url и создает и возвращает новый экземпляр UrlHelper , Это дает моему приложению некоторые ярлыки для некоторых вспомогательных методов. (Да, было бы лучше, но это в приложении larvel ...)Как издеваться над глобальными функциями и классами, используемыми другим классом

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

Использование phpunit, как я могу перехватить вызов web или создание UrlHelper, чтобы я мог гарантировать, что он возвращает данный ответ? код выглядит как следующий

function web($url){ 
return new \another\namespace\UrlUtility($url); 
} 

...

namespace some/namespace; 

class checker { 
    function compare($url, $content){ 
     $content = web($url)->content(); 
     ...logic... 
     return $status; 
    } 
} 

Тест блок тестирует логику сравнения, поэтому я хочу, чтобы получить ожидаемое содержание от web вызова. Я надеялся, что макеты/заглушки сделают трюк - но я не уверен, могу ли я ударить по этой глобальной функции или другому классу, который не прошел?

Благодаря

+2

Посмотрите на эту http://stackoverflow.com/a/6154470, возможно, потребуется использовать расширение PHP – OnIIcE

ответ

3

Вы можете перегрузить класс с помощью Mockery, а затем изменить реализацию метода.

$mock = \Mockery::mock('overload:'.HelperUtil::class); 
$mock->shouldReceive('content')->andReturnUsing(function() { 
    return 'different content'; 
}); 
+0

brill, именно то, что я хотел =) –

+0

Это сработало для меня. Тем не менее, важно отметить, что для этого вам необходимо использовать autoload (не требуется). – Franco

1

Вы можете быть загрязнены повторно объявить глобальную функцию в пространстве имен в тесте, который будет иметь приоритет.

Примечание: это грязно.

+1

Этот метод также может быть использован для «локально переопределить» Уроженец функции PHP - очень полезно для таких вызывает как 'time()', как используется в phpunit-bridge/ClockMock.php –

 Смежные вопросы

  • Нет связанных вопросов^_^