【问题标题】:symfony 2.1 phpunit Swift_Message class not foundsymfony 2.1 phpunit Swift_Message 类未找到
【发布时间】:2013-04-11 08:09:01
【问题描述】:

我对 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>

【问题讨论】:

  • 如何运行测试?确保使用“-c”选项告诉 phpunit phpunit.xml 配置文件在哪里。因此,如果它在“app”目录中,它应该如下所示:“phpunit -c app src/Project/AppBundle/Tests/MailTest.php”
  • 是的,这是我运行它的确切命令。但仍然无法正常工作。
  • 尝试更改:bootstrap="./autoload.php" 与 bootstrap="bootstrap.php.cache"

标签: symfony phpunit swiftmailer classnotfound


【解决方案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版本。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果你先实例化 $message 然后再调用 static::createClient 是否有效?

      【讨论】:

        猜你喜欢
        • 2013-01-04
        • 2019-04-17
        • 2016-09-09
        • 2016-11-28
        • 2016-06-13
        • 2013-07-18
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多