garrcomm / phpunit-helpers
在构建单元测试时,这些助手可以...很有帮助。
v1.0.0
2021-09-04 17:05 UTC
Requires
- php: >=7.3
- phpunit/phpunit: ^9.4
Requires (Dev)
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);