code-distortion / insight
测试受保护和私有对象方法和属性,就像它们是公共的一样
Requires
- php: 7.0.* | 7.1.* | 7.2.* | 7.3.* | 7.4.* | 8.0.* | 8.1.* | 8.2.* | 8.3.*
Requires (Dev)
- infection/infection: ^0.10 | ^0.11 | ^0.12 | ^0.13 | ^0.14 | ^0.15 | ^0.16 | ^0.17 | ^0.18 | ^0.19 | ^0.20 | ^0.21 | ^0.22 | ^0.23 | ^0.24 | ^0.25 | ^0.26 | ^0.27
- jchook/phpunit-assert-throws: ^1.0
- phpstan/phpstan: ^0.9 | ^0.10 | ^0.11 | ^0.12 | ^1.0
- phpunit/phpunit: ~4.8 | ^5.0 | ^6.0 | ^7.0 | ^8.4 | ^9.0 | ^10.0
- squizlabs/php_codesniffer: ^3.8.0
README
code-distortion/insight 是一个 PHP 库,允许你访问 protected 和 private 对象方法和属性,就像它们是 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 允许你以与常规方法和属性相同的方式访问静态方法和属性。只需在属性或方法名称后分别添加 StaticProp 或 StaticMethod 即可。
// 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.X,0.X.y,X.y.z。当此库变为 1.0.0,2.0.0 等版本时,并不一定表示它是一个显著的版本,它仅仅表示更改是破坏性的。
实物商品
此包是 Treeware。如果你在生产环境中使用它,我们要求你 为世界买一棵树 以感谢我们的工作。通过为 Treeware 森林做出贡献,你将为当地家庭创造就业机会并恢复野生动物栖息地。
贡献
请参阅CONTRIBUTING以获取详细信息。
行为准则
请参阅CODE_OF_CONDUCT以获取详细信息。
安全
如果您发现任何与安全相关的问题,请发送电子邮件至tim@code-distortion.net而不是使用问题跟踪器。
鸣谢
许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。