garrcomm/phpunit-helpers

在构建单元测试时,这些助手可以...很有帮助。

v1.0.0 2021-09-04 17:05 UTC

This package is auto-updated.

Last update: 2024-09-15 14:22:29 UTC


README

名称暗示复数,但目前只有一个助手:FunctionMock。不过,还有一个正在制作中,MysqliMock。请注意,这个助手仍在开发中,并将始终有点限制。

FunctionMock 示例

\Garrcomm\PHPUnitHelpers\FunctionMock::mock(
    __NAMESPACE__,
    'mail',
    function ($to, $subject, $body) use (&$verify) {
        $verify = [
            'to' => $to,
            'subject' => $subject,
            'body' => $body,
        ];
        return true;
    }
);

$result = mail('foo@bar.baz', 'subject', 'body');

$this->assertTrue($result);
$this->assertEquals('foo@bar.baz', $verify['to']);
$this->assertEquals('subject', $verify['subject']);
$this->assertEquals('body', $verify['body']);

也要在测试后清理,所以在你单元测试中添加

class MyTest Extends PHPUnit\Framework\TestCase
{
    public function tearDown(): void
    {
        \Garrcomm\PHPUnitHelpers\FunctionMock::releaseAll();
        parent::tearDown();
    }
}

MysqliMock 示例

在你的测试中,你需要实现至少两个方法来确保测试正常运行

use Garrcomm\PHPUnitHelpers\Mysqli\MysqliMock;

class MyTest Extends PHPUnit\Framework\TestCase
{
    public function tearDown(): void
    {
        MysqliMock::reset();
    }

    public static function setUpBeforeClass(): void
    {
        MysqliMock::init();
    }
}

这确保在运行测试后清除所有数据,并确保加载适当的文件以便测试。

要测试构造函数中是否正确指定了所有属性,使用

$engine = new mysqli('foo.bar', 'foo', 'bar', 'foobar', 1337);

Garrcomm\PHPUnitHelpers\Mysqli\MysqliMock::assertConstructor(function (
    ?string $hostname,
    ?string $username,
    ?string $password,
    ?string $database,
    ?int $port,
    ?string $socket
) {
    $this->assertEquals('foo.bar', $hostname);
    $this->assertEquals('foo', $username);
    $this->assertEquals('bar', $password);
    $this->assertEquals('foobar', $database);
    $this->assertEquals(1337, $port);
    $this->assertNull($socket);
});

要测试 mysqli_report 是否被正确调用,使用

Garrcomm\PHPUnitHelpers\Mysqli\MysqliMock::assertMysqliReport(function(int $flags) {
    $this->assertEquals(3, $flags); // 3 = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT
});

要模拟查询结果,并检查是否调用了查询,使用

$fooRequested = false;
Garrcomm\PHPUnitHelpers\Mysqli\MysqliMock::setQueryResponder(
    function (string $query, int $result_mode = MYSQLI_STORE_RESULT) use (&$fooRequested) {
        if ($query == 'SELECT `foo` FROM `bar`' && $result_mode == MYSQLI_STORE_RESULT) {
            $fooRequested = true;
            return \mysqli_result::mockFromArray([['foo' => 'baz']]);
        }
    }
);

performAction();

// Assert if the query is actually executed
$this->assertTrue($fooRequested);