阅读(3191) (0)

CodeIgniter4 数据库测试

2020-08-17 10:51:46 更新

测试类

为了利用CodeIgniter提供的用于测试的内置数据库工具,您的测试必须扩展CIDatabaseTestCase

<?php namespace App\Database;


use CodeIgniter\Test\CIDatabaseTestCase;


class MyTests extends CIDatabaseTestCase
{
    . . .
}

因为在setUp()tearDown()阶段执行了特殊功能,所以如果需要使用父方法,则必须确保调用它们的方法,否则将丢失此处描述的许多功能:

<?php namespace App\Database;


use CodeIgniter\Test\CIDatabaseTestCase;


class MyTests extends CIDatabaseTestCase
{
    public function setUp()
    {
        parent::setUp();


        // Do something here....
    }


    public function tearDown()
    {
        parent::tearDown();


        // Do something here....
    }
}

设置测试数据库

在运行数据库测试时,您需要提供一个可以在测试期间使用的数据库。该框架提供了特定于CodeIgniter的工具,而不是使用PHPUnit内置的数据库功能。第一步是确保您已testsapp / Config / Database.php中设置了一个数据库组。这指定了仅在运行测试时使用的数据库连接,以确保其他数据的安全。

如果团队中有多个开发人员,则可能需要将凭据存储在.env文件中。为此,请编辑文件以确保存在以下各行并具有正确的信息:

database.tests.dbdriver = 'MySQLi';
database.tests.username = 'root';
database.tests.password = '';
database.tests.database = '';

迁移与种子

运行测试时,您需要确保数据库具有正确的架构设置,并且每个测试都处于已知状态。通过向测试中添加几个类属性,可以使用迁移和种子设置数据库。

<?php namespace App\Database;


use CodeIgniter\Test\CIDatabaseTestCase;


class MyTests extends\CIDatabaseTestCase
{
    protected $refresh  = true;
    protected $seed     = 'TestSeeder';
    protected $basePath = 'path/to/database/files';
}

$refresh

此布尔值确定在每次测试之前是否完全刷新数据库。如果为true,则将所有迁移回滚到版本0,然后将数据库迁移到最新的可用迁移。

$seed

如果存在且不为空,则此参数指定种子文件的名称,该种子文件用于在每次运行测试之前用测试数据填充数据库。

$basePath

默认情况下,CodeIgniter将在tests / _support / Database / Seeds中查找以在测试期间运行它的种子。您可以通过指定$basePath属性来更改此导演。它不应该包括种子目录,而是包含子目录的单个目录的路径。

$namespace

默认情况下,CodeIgniter将在tests / _support / DatabaseTestMigrations / Database / Migrations中查找以定位在测试期间应运行的迁移。您可以通过在$namespace属性中指定新的名称空间来更改此位置。这不应包括数据库/迁移路径,而应仅包括基本名称空间。

辅助方法

CIDatabaseTestCase类提供了一些辅助方法在测试你的数据库,以帮助。

seed($name)

允许您将“种子”手动加载到数据库中。唯一的参数是要运行的种子的名称。种子必须存在于中指定的路径中$basePath

dontSeeInDatabase($ table,$ criteria)

断言$criteria数据库中不存在具有与键/值对匹配的条件的行。

$criteria = [
    'email'  => 'joe@example.com',
    'active' => 1
];
$this->dontSeeInDatabase('users', $criteria);

seeInDatabase($ table,$ criteria)

断言$criteria数据库中存在具有与DOES中的键/值对匹配的条件的行。

$criteria = [
    'email'  => 'joe@example.com',
    'active' => 1
];
$this->seeInDatabase('users', $criteria);

captureFromDatabase($ table,$ column,$ criteria)

返回与$column行匹配的指定表中的值$criteria。如果找到多个行,它将仅针对第一行进行测试。

$username = $this->grabFromDatabase('users', 'username', ['email' => 'joe@example.com']);

hasInDatabase($ table,$ data)

在数据库中插入新行。当前测试运行后,该行将被删除。$data是具有要插入表中的数据的关联数组。

$data = [
    'email' => 'joe@example.com',
    'name'  => 'Joe Cool'
];
$this->hasInDatabase('users', $data);

seeNumRecords($ expected,$ table,$ criteria)

断言在数据库中找到了许多匹配的匹配行$criteria

$criteria = [
    'active' => 1
];
$this->seeNumRecords(2, 'users', $criteria);