我目前正在为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接口(interface)gubbins来处理不同的路由和模板系统,开心开心开心开心。

这是我尝试为上述设置的初始测试:
<?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,因此我不能使用自己创建的任何模拟对象。我尝试过的一种方法是创建一个抽象类,该类在测试页上实现正确的接口(interface),但是getMockForAbstractClass失败,表明找不到该类。

最佳答案

模拟时,您需要使用完全限定的类路径,因为模拟功能未考虑调用代码或任何“使用”语句的 namespace 。
尝试

->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)

关于php - PHPUnit,接口(interface)和命名空间(Symfony2),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8154471/

10-13 02:51