symfony 2.1 phpunit未找到Swift_Message类

时间:2013-04-18 09:21:35

标签: symfony phpunit swiftmailer classnotfound

我遇到了symfony和phpunit的问题。我们的项目正在变得越来越大。所以我们决定为phpunit激活进程隔离,因为服务器再也无法忍受测试的数量(RAM不够)。从那时起,发送邮件的所有测试都不再有效。有人可以帮助我们吗?如果processIsolation =“false”,则下面的测试完全正常,但如果processIsolation =“true”则失败

版本:

  • symfony 2.1.8-dev

  • phpunit 3.7.9

错误消息

项目\的appbundle \测试\ MailTest :: testSendMail PHPUnit_Framework_Exception:PHP致命错误:/var/www/project/src/Project/AppBundle/Tests/MailTest.php中找不到类'Swift_Message'

测试

public function testSendMail()
{
    $client = static::createClient();

    $message = \Swift_Message::newInstance();
    $message->setFrom('example@example.com')
        ->setTo('example@example.com')
        ->setSubject('Subject')
        ->setBody('Hello World')
        ->setContentType('text/html');

    $client->getContainer()->get('mailer')->send($message);
    $this->assertTrue(true);
}

phpunit.xml

<phpunit
    backupGlobals="false"
    backupStaticAttributes="false"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    bootstrap="./autoload.php"
    processIsolation="true"
    stopOnFailure="false"
    syntaxCheck="false" >

    <testsuites>
        <testsuite name="Project Test Suite">
            <directory>../src/Project/AppBundle/Tests/MailTest.php</directory>
        </testsuite>
</testsuites>
</phpunit>

3 个答案:

答案 0 :(得分:1)

导致此错误是因为Switfmailer定义了一个常量 安装它的自动加载器后SWIFT_REQUIRED_LOADED。该 autoloader检查此常量,如果已定义,则拒绝 安装自动加载器。在进程隔离中,PHPUnit确保了这一点 所有定义的常量都在生成的进程中重新定义 运行测试。不幸的是,这意味着SWIFT_REQUIRED_LOADED 在测试过程中定义,因此自动加载器不加载(参见 swiftmailer源目录中的“swift_required.php”)。注意 如果你关闭包括全局状态的测试通过注释你的 测试仍然无法正常工作,因为bootstrap文件传递给了 通过__PHPUNIT_BOOTSTRAP全局变量测试过程(参见 PHPUnit目录中的TestCaseMethod.tpl)。没有全局, 这个全局在测试过程中是未定义的,而bootstrap文件是 不包括破坏测试。

唯一可以解决的问题是我找到的工作是更换线路 $constants = PHPUnit_Util_GlobalState::getConstantsAsString();$constants = ''; 在PHPUnit源代码分发中的TestCase.php的run方法中。如果你的代码 依赖于在测试用例运行之前定义的全局常量 这个修复显然不适合你(类常量是一个  不同的故事);除非所述常量将在安全中重新定义 运行测试用例的过程。

答案 1 :(得分:1)

这是由与swiftmailer自动加载器相关的问题引起的。

我遇到了同样的问题并将其修复为swiftmailer的分叉存储库。

您可以在此找到修复程序的公关:https://github.com/swiftmailer/swiftmailer/pull/416

<击> 如果您不想等到合并后,可以使用我的存储库将其添加到composer.json

"require": {
    "swiftmailer/swiftmailer": "dev-master as 5.0.x-dev"
},
"repositories": [
    {
        "type": "vcs",
        "url":  "https://github.com/NickStemerdink/swiftmailer.git"
    }
]

<击>

更新: PR同时已合并,因此您只需更新到最新的swiftmailer版本。

答案 2 :(得分:0)

如果您首先实例化$ message并在之后调用static :: createClient,它是否有效?