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 не работает, заявляя, что не может найти класс ...

6
задан hakre 18 April 2013 в 16:51
поделиться