【发布时间】:2021-09-23 10:46:38
【问题描述】:
我正在尝试为 nextcloud 的扩展(应用程序)编写集成测试。 Nextcloud 本身是基于 Symfony 的。长话短说,到目前为止,我以一个测试类结束,它抛出了以下错误消息:
PHPUnit 8.5.15 by Sebastian Bergmann and contributors.
IE 2 / 2 (100%)
Time: 642 ms, Memory: 24.00 MB
There was 1 error:
1) tests\Integration\Setup\Migrations\Version000000Date20210701093123Test::testRedundantEntriesInDB with data set "caseC" (array(), array('bob'))
PHPUnit\Framework\Exception: PHP Fatal error: Uncaught Exception: Serialization of 'Closure' is not allowed in Standard input code:340
Stack trace:
#0 Standard input code(340): serialize(Array)
#1 Standard input code(1237): __phpunit_run_isolated_test()
#2 {main}
thrown in Standard input code on line 340
ERRORS!
Tests: 2, Assertions: 1, Errors: 1, Incomplete: 1.
我试图找到这个错误的罪魁祸首,据我所知,这是因为我使用 @runInSeparateProcess 作为命名测试的注释,并且 PHPUnit 尝试的一些全局状态似乎存在为子 PHP 进程保存/序列化。
简化的 MWE 代码可在in a branch on github 或以下获取,以供以后参考。 在阅读Symfony 2 + Doctrine 2 + PHPUnit 3.5: Serialization of closure exception 和此处的类似问题后,我试图缩小问题范围。 created container 是某种全局存储,它将保存依赖注入方法的各种实例。
如何避免 PHPUnit 试图保持这种状态?事实上,我使用进程分离来为测试提供一个干净的启动环境。
让我有点吃惊的是,只有当数据提供者的第二个函数参数是非空数组时才会出现错误。
如果需要,可以克隆 repo 并构建一些 docker 容器(在 Linux 下,IDK 关于 Windows)来手动运行测试。只需转到.github/actions/run-tests 并致电./run-locally.sh --prepare stable21 来构建环境(喝一大杯咖啡)。然后可以用./run-locally.sh --run-integration-tests --filter 'tests\\Integration\\Setup\\Migrations\\Version000000Date20210701093123Test'开始测试。
这里是基本的 MWE 代码:
<?php
namespace tests\Integration\Setup\Migrations;
use OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer;
use PHPUnit\Framework\TestCase;
class Version000000Date20210701093123Test extends TestCase {
/**
* @var IAppContainer
*/
private $container;
public function setUp(): void {
parent::setUp();
$app = new App('cookbook');
$this->container = $app->getContainer();
}
/**
* @dataProvider dataProvider
* @runInSeparateProcess
*/
public function testRedundantEntriesInDB($data, $updatedUsers) {
// print_r($updatedUsers);
sort($updatedUsers);
// print_r($updatedUsers);
$this->assertEquals($updatedUsers, []);
$this->markTestIncomplete('Not yet implemented');
}
public function dataProvider() {
return [
'caseB' => [
[
],
[],
],
'caseC' => [
[
],
['bob']
],
];
}
}
【问题讨论】:
-
也许这个注释会帮助phpunit.de/manual/6.5/en/…
-
这没有帮助。此外,该设置应该已经由 XML 配置设置。
标签: php phpunit integration-testing nextcloud