r83dev/test-accessible

可访问特性,用于在测试中调用受保护的方法、属性和常量。

v1.0.0 2024-05-30 13:33 UTC

This package is auto-updated.

Last update: 2024-08-30 14:12:28 UTC


README

一个测试辅助类,特别是针对单元测试,用于访问不可访问的方法或获取/注入属性。

安装

通过composer安装

dcrr composer req --dev r83dev/test-accessible

用法

在您的测试中使用AccessibleTrait

class MyTest {
    use R83Dev\TestAccessible\AccessibleTrait;
}

使用其中一个辅助函数来访问实例化对象的私有或受保护的内容。

方法

调用不可访问的方法

$this->callInaccessibleMethod($object, 'method_name', 'argument1', 'argument2', ...);

获取不可访问的属性

$this->getInaccessibleProperty($object, 'property_name');

设置不可访问的属性

$this->setInaccessibleProperty($object, 'property_name', 'new_property_value');

获取不可访问的常量

$this->getInaccessibleConstant($object, 'CONSTANT_NAME');

PHPUnitTest 示例

这只是一个功能演示,从内容方面来说没有用处。

要测试的单元示例

class MyUnit
{
    protected const STATE_ON = 'on';
    protected const STATE_OFF = 'off';
    private string $state = self::STATE_ON;
    
    protected function setState(string $state): void
    {
        $this->state = $state;
    }
    
    public function getState(): string
    {
        return $this->state;
    }
}

单元测试示例

class MyUnitTest extends PHPUnit\Framework\TestCase
{
    use R83Dev\TestAccessible\AccessibleTrait;
    
    private ?MyUnit $unit;

    protected function setUp(): void
    {
        $this->unit = new MyUnit();
    }

    #[\PHPUnit\Framework\Attributes\Test]
    public function getStateShouldReturnCorrectInitialValue(): void
    {
        $this->assertSame(
            $this->getInaccessibleConstant($object, 'STATE_ON'),
            $this->getInaccessibleProperty($this->unit, 'state')
        );
    }

    #[\PHPUnit\Framework\Attributes\Test]
    public function getStateReturnsNewValueFromSetter(): void
    {
        $off = $this->getInaccessibleConstant($object, 'STATE_OFF');
        $this->callInaccessibleMethod($object, 'setState', $off)
        $this->assertSame($off, $this->unit->getState());
    }

    #[\PHPUnit\Framework\Attributes\Test]
    public function getStateReturnsNewValueFromPropertyAllocation(): void
    {
        $this->setInaccessibleProperty($object, 'state', 'unknown')
        $this->assertSame('unknown', $this->unit->getState());
    }
}