gpt4 book ai didi

PHPUnit、接口(interface)和命名空间 (Symfony2)

转载 作者:可可西里 更新时间:2023-11-01 13:56:17 26 4
gpt4 key购买 nike

我目前正在为 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 来处理不同的路由和模板系统,happy happy happy joy joy joy。

这是我尝试为上述设置的初始测试:

<?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 失败了,说明它找不到该类...

最佳答案

模拟时,您需要使用完整限定类路径,因为模拟功能不会考虑调用代码的命名空间或任何“使用”语句。

尝试

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com