hotel-quickly/nette-phpunit

Nette + PHPunit + 多数据库 + fixtures

0.2.1 2016-08-12 09:36 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:26:12 UTC


README

  • 支持多数据库连接
  • 支持加载多种 fixtures 格式(每个连接)

入门指南

安装

运行以下命令以安装此软件包

composer require --dev hotel-quickly/nette-phpunit

用法

为了使用数据库测试用例,您必须从 HQ\Test\AbstractDbTestCase 扩展您的基类并实现以下 3 个方法

  1. getContainer - 此方法将返回 Nette\Di\Container 实例。
  2. getConnections - 返回一个 HQ\Test\Connection\AbstractConnection(connectionName, baseSchema, ...) 连接对象的数组。
  • connectionName - 数据库连接名称,将用作 fixtures 文件的前缀。
  • baseSchema - 包含 CREATE TABLE ... SQL 语句的数据库模式。
  1. getBaseFixtureDir - 返回搜索基本 fixtures 文件的基目录(参见
use HQ\Test\AbstractDbTestCase;
use HQ\Test\Connection\NetteConnection;

class YourBaseDbTestCase extends AbstractDbTestCase
{
    protected function getContainer()
    {
        return require dirname(__DIR__) . '/app/bootstrap.php';
    }

    protected function getConnections()
    {
        return [
            new NetteConnection('default', __DIR__ . '/../tests/skeleton.sql', $this->container->getService('database.default.context'))
        ];
    }

    public function getBaseFixtureDir()
    {
        return __DIR__;
    }
}

处理 fixtures

加载 fixtures

默认情况下,fixtures 将自动从以下 3 个位置按顺序加载

  1. 基本 fixtures
  2. 类 fixtures
  3. 实例 fixtures
1. 基本 fixtures

这是所有测试用例都将加载的基本 fixtures(将其视为整个应用程序的初始数据)

test
  +- YourBaseDbTestCase.php
  +- <connection-name>-fixtures.{yaml, json, php} e.g. default-fixtures.json 
2. 类 fixtures

每次调用测试用例时都会加载。

test
  +- User
    +- UserTest.php
    +- <connection-name>-fixtures.{yaml, json, php} e.g. default-fixtures.json
3. 实例 fixtures

这与 class fixtures 几乎相同,只不过我们在 TestCase 本身内部定义了 fixtures(因此只支持 php array)。

class MyTest extends MyBaseDbTestCase
{
    public function getFixtures()
    {
        return [
            '<connection-name>' => [
                ...
            ]
        ]
    }
}

####Fixtures 格式 + 结构 此库目前支持 3 种 fixtures 格式,例如 jsonyamlphp。所有格式都具有相同的 fixtures 结构,即

[
  "<table-name>": [
     [
        "<field-name1>": "<value1>",
        "<field-name2>": "<value2>"
     ],
     ...
   ]
]

json 示例

{
    "user": [
        {"username": "john"},
        {"username": "jane"}
    ]
}

yaml 示例

user:
  -
    username: john
  -
    username: jane

php 示例 - 注意 - 不要忘记放置 return 语句

return [
    'user' => [
        ['username' => 'john'],
        ['username' => 'jane'],
    ]
]

提高测试速度

由于在测试开始时创建数据库模式的开销(仅一次),这可能会降低您的测试套件的运行速度。您可以通过导出 UNITTEST_CREATE_SCHEMA=false 环境变量,然后像平常一样运行单元测试来避免这个问题。这将使其跳过数据库模式创建开销。

常见问题

  • InvalidArgumentException: 已存在名称为 account 的表,但表定义不同。

此错误表示您的 fixtures 对于相同的数据集(例如 table,例如 user)具有不同的列结构。例如,您有一个包含 user 表的 default-fixtures.yaml,它具有以下字段

user:
  -
    username: john

但在其他 fixtures 中,您有相同名称的用户表,但具有不同的字段,例如

user:
  -
    email: john

这将导致上述错误。要修复此问题,只需确保在每个 fixtures 上定义相同的字段。

  • ErrorException: ini_set(): 无法更改 zlib.output_compression - headers already sent

当 Nette 在容器中启用了 php ini zlib.output_compression 时,会出现这种情况。在测试期间删除此配置将修复此错误