contao/test-case

Contao 测试用例

5.4.3 2024-07-30 16:12 UTC

README

Contao 是一个开源的 PHP 内容管理系统,适用于希望拥有易于维护的专业网站的人。访问 项目网站 获取更多信息。

Contao 测试用例提供了带有一些有用方法的 PHPUnit 测试用例,用于测试 Contao。运行 php composer.phar require --dev contao/test-case 安装包,然后在测试类中使用它

use Contao\TestCase\ContaoTestCase;

class MyTest extends ContaoTestCase
{
}

模拟 Symfony 容器

getContainerWithContaoConfiguration() 方法模拟了一个具有 Contao 核心扩展默认配置的 Symfony 容器。

$container = $this->getContainerWithContaoConfiguration();

echo $container->getParameter('contao.upload_path'); // will output "files"

您还可以设置项目目录

$container = $this->getContainerWithContaoConfiguration('/tmp');

echo $container->getParameter('kernel.project_dir'); // will output "/tmp"
echo $container->getParameter('kernel.root_dir'); // will output "/tmp/app"
echo $container->getParameter('kernel.cache_dir'); // will output "/tmp/var/cache"

模拟 Contao 框架

mockContaoFramework) 方法模拟了一个初始化的 Contao 框架。

$framework = $this->mockContaoFramework();
$framework
    ->expect($this->atLeastOnce())
    ->method('initialize')
;

该方法自动添加一个带有 Contao 设置的 Config 适配器

$framework = $this->mockContaoFramework();
$config = $framework->getAdapter(Contao\Config::class);

echo $config->get('datimFormat'); // will output "'Y-m-d H:i'"

您可以选择添加更多适配器作为参数

$adapters = [
    Contao\Config::class => $configAdapter,
    Contao\Encryption::class => $encryptionAdapter,
];

$framework = $this->mockContaoFramework($adapters);

给定的 Config 适配器将覆盖默认的 Config 适配器。

模拟适配器

mockAdapter() 方法将模拟具有给定方法的适配器。

$adapter = $this->mockAdapter(['findById']);
$adapter
    ->method('findById')
    ->willReturn($model)
;

$framework = $this->mockContaoFramework([Contao\FilesModel::class => $adapter]);

具有简单返回值的适配器,如上述内容,可以进一步简化

$adapter = $this->mockConfiguredAdapter(['findById' => $model]);

此代码与上述代码完全相同。

模拟具有魔法属性的类

mockClassWithProperties() 方法模拟了一个使用魔法 __set()__get() 方法来管理属性的类。

$mock = $this->mockClassWithProperties(Contao\PageModel::class);
$mock->id = 2;
$mock->title = 'Home';

echo $mock->title; // will output "Home"

如果要模拟的类是只读的,您可以可选地以构造函数参数的形式传递属性

$properties = [
    'id' => 2,
    'title' => 'Home',
];

$mock = $this->mockClassWithProperties(Contao\PageModel::class, $properties);

echo $mock->title; // will output "Home"

如果您需要调用原始类的某个方法,您可以传递方法名称作为第三个参数。生成的模拟对象将是一个没有给定方法的部分模拟对象。

$mock = $this->mockClassWithProperties(Contao\PageModel::class, [], ['getTable']);
$mock->id = 2;

echo $mock->getTable(); // will call the original method

模拟令牌存储

mockTokenStorage() 模拟了一个返回 Contao 后端或前端用户的令牌存储。

$tokenStorage = $this->mockTokenStorage(Contao\BackendUser::class);
$user = $tokenStorage->getToken()->getUser();

使用临时目录

getTempDir() 方法根据测试类名称创建一个临时目录并返回其路径。

$fs = new Filesystem();
$fs->mkdir($this->getTempDir().'/var/cache');

测试运行完成后,该目录将自动删除。为此,请确保您在测试类中定义了方法时始终调用父 tearDownAfterClass() 方法!

use Contao\TestCase\ContaoTestCase;

class MyTest extends ContaoTestCase
{
    public static function tearDownAfterClass()
    {
        // The temporary directory would not be removed without this call!
        parent::tearDownAfterClass();
    }
}