我遇到了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>
答案 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,它是否有效?