4

我对 symfony 和 phpunit 有疑问。我们的项目越来越大。所以我们决定为 phpunit 激活进程隔离,因为服务器无法再承受大量的测试(没有足够的 RAM)。从那时起,所有发送邮件的测试都不再工作了。有人可以帮助我们吗?如果 processIsolation="false" 下面的测试工作得很好,但如果 processIsolation="true" 则失败

版本:

  • symfony 2.1.8-dev

  • phpunit 3.7.9

错误信息

Project\AppBundle\Tests\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>
4

3 回答 3

1

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

我发现唯一可行 的解​​决方法是将 PHPUnit 源代码分发中 TestCase.php 的 run 方法中的行$constants = PHPUnit_Util_GlobalState::getConstantsAsString(); 替换 为。$constants = '';如果您的代码依赖于在测试用例运行之前定义的全局常量,那么此修复显然对您不起作用(类常量是另一回事);除非在运行测试用例的过程中安全地重新定义所述常量。

于 2013-06-07T17:13:32.563 回答
1

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

我遇到了同样的问题,并在 swiftmailer 的分叉存储库中修复了它。

在这里您可以找到修复的 PR: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 版本。

于 2014-01-14T12:49:47.360 回答
0

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

于 2013-06-07T08:39:39.660 回答