测试受保护和私有对象方法和属性,就像它们是公共的一样

0.1.4 2023-12-31 15:19 UTC

This package is auto-updated.

Last update: 2024-08-30 01:28:54 UTC


README

Latest Version on Packagist PHP Version GitHub Workflow Status Buy The World a Tree Contributor Covenant

code-distortion/insight 是一个 PHP 库,允许你访问 protectedprivate 对象方法和属性,就像它们是 public 的一样。

$myObject->privateMethod();   // "Error: Call to private method ..."

$testObject = new Insight($myObject);
$testObject->privateMethod(); // success

这可能在进行测试时很有用。 这可能是好主意,也可能不是。 由你自己决定。

注意:将 Insight 用于测试之外的目的可能是一个代码问题。

安装

通过 composer 安装此包

composer require code-distortion/insight --dev

用法

实例化 Insight 对象

// build based on an existing object
$myObject = new MyClass();
$testObject = new Insight($myObject);

// or
$testObject = new Insight(new MyClass());

$testObject 将表现得像原始对象一样,但同时也允许你访问其受保护和私有方法和属性。

读取和写入受保护和私有属性

$testObject->publicProp = 'something';
$testObject->protectedProp = 'something';
$testObject->privateProp = 'something';

print $testObject->publicProp;
print $testObject->protectedProp;
print $testObject->privateProp;

调用受保护和私有方法

print $testObject->publicMethod();
print $testObject->protectedMethod();
print $testObject->privateMethod();

这些在测试你的代码时(使用 phpunit)可能很有用

$this->testSame('someValue', $testObject->privateProperty);
$this->testSame('someValue', $testObject->privateMethod());

抽象类

你可以通过在实例化 Insight 对象时传递 class 来测试抽象类(以及构造函数不是公共的类)。

$testObject = new Insight(MyClass::class);

注意:当你以这种方式(而不是对象)实例化 Insight 时,你只能访问其 static 方法和属性。

注意:要测试抽象类的其他功能,你需要有一个扩展该抽象类的具体类,并使用该类。

静态方法和属性

PHP 也没有 __getStatic()__setStatic() 魔术方法来帮助访问受保护的属性。

相反,Insight 允许你以与常规方法和属性相同的方式访问静态方法和属性。只需在属性或方法名称后分别添加 StaticPropStaticMethod 即可。

// calling them from an Insight object
$testObject = new Insight(new MyClass());
// or
$testObject = new Insight(MyClass::class);

$testObject->privateStaticProp = 'something';
$testObject->privateStaticMethod();

// this syntax is also available allowing you to access them in one line
Insight::{myClass::class}()->privateStaticProp = 'something';
Insight::{myClass::class}()->privateStaticMethod();

其他

你可以通过访问 ->insight 属性来访问底层对象或类

// when instantiated using an object
$myObject = new MyClass();
$testObject = new Insight($myObject);
$testObject->insight; // === $myObject

// when instantiated using a class name
$testObject = new Insight(MyClass::class);
$testObject->insight; // === 'Namespace\To\MyClass'

测试此包

  • 克隆此包: git clone https://github.com/code-distortion/insight.git .
  • 运行 composer install 来安装依赖项
  • 运行测试: composer test

变更日志

请参阅 CHANGELOG 以获取有关最近更改的更多信息。

SemVer

此库使用 SemVer 2.0.0 版本控制。这意味着对 X 的更改表示破坏性更改:0.0.X0.X.yX.y.z。当此库变为 1.0.0,2.0.0 等版本时,并不一定表示它是一个显著的版本,它仅仅表示更改是破坏性的。

实物商品

此包是 Treeware。如果你在生产环境中使用它,我们要求你 为世界买一棵树 以感谢我们的工作。通过为 Treeware 森林做出贡献,你将为当地家庭创造就业机会并恢复野生动物栖息地。

贡献

请参阅CONTRIBUTING以获取详细信息。

行为准则

请参阅CODE_OF_CONDUCT以获取详细信息。

安全

如果您发现任何与安全相关的问题,请发送电子邮件至tim@code-distortion.net而不是使用问题跟踪器。

鸣谢

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。