PHPUnit, интерфейсы и пространства имен (Symfony2)

В настоящее время я работаю над пакетом с открытым исходным кодом для Symfony2 и действительно хочу, чтобы это были собаки-надмеры с точки зрения охвата единичных тестов и общей надежности, однако я столкнулся с проблемой из-за отсутствия знаний PHPUnit (или сложный сценарий, кто знает) ..

В настоящее время у меня есть класс Mailer для обработки отдельных почтовых сценариев. Это выглядит примерно так:

<?php use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface; use Symfony\Component\Routing\RouterInterface; class Mailer { protected $mailer; protected $router; protected $templating; protected $parameters; public function __construct($mailer, RouterInterface $router, EngineInterface $templating, array $parameters) { $this->mailer = $mailer; $this->router = $router; $this->templating = $templating; $this->parameters = $parameters; } } 

Достаточно просто, получили некоторые губбины интерфейса Symfony2, чтобы обрабатывать различные системы маршрутизации и шаблонов, радость счастливой радости.

Вот начальный тест, который я пробовал настроить для вышеперечисленного:

 <?php use My\Bundle\Mailer\Mailer class MailerTest extends \PHPUnit_Framework_TestCase { public function testConstructMailer { $systemMailer = $this->getSystemMailer(); $router = $this->getRouter(); $templatingEngine = $this->getTemplatingEngine(); $mailer = new Mailer($systemMailer, $router, $templatingEngine, array()); } protected function getSystemMailer() { $this->getMock('SystemMailer', array('send'); } protected function getRouter() { $this->getMock('RouterInterface', array('generate'); } protected function getTemplatingEngine() { $this->getMock('RouterInterface', array('render'); } } 

Проблема здесь в том, что мои макетные объекты не реализуют Symfony \ Bundle \ FrameworkBundle \ Templating \ EngineInterface и Symfony \ Component \ Routing \ RouterInterface, поэтому я не могу использовать какие-либо макетные объекты, которые я сам создаю. Один из методов, которые я попытался создать, представляет собой абстрактный класс, который реализует правильный интерфейс на тестовой странице, однако getMockForAbstractClass терпит неудачу, заявив, что он не может найти класс …

Solutions Collecting From Web of "PHPUnit, интерфейсы и пространства имен (Symfony2)"

Когда вы издеваетесь над необходимостью использовать полный путь к классу, поскольку макетная функциональность не учитывает пространство имен вызывающего кода или каких-либо «используемых» утверждений.

Пытаться

 ->getMock('\\Symfony\\Component\\Routing\\RouterInterface'); 

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

пример

 <?php namespace bar; class MyClass {} namespace foo; use \bar\MyClass; class MockingTest extends \PHPUnit_Framework_TestCase { public function testMock() { var_dump($this->getMock('MyClass') instanceOf MyClass); var_dump($this->getMock('\\bar\\MyClass') instanceOf MyClass); } } 

Производит:

 /phpunit.sh --debug fiddleTestThree.php PHPUnit @package_version@ by Sebastian Bergmann. Starting test 'foo\MockingTest::testMock'. .bool(false) bool(true)