Test protected and private object methods and properties as if they were public

0.1.4 2023-12-31 15:19 UTC

This package is auto-updated.

Last update: 2024-10-30 01:53:50 UTC


README

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

code-distortion/insight is a PHP library that allows you to access protected and private object methods and properties, as if they were public.

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

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

This might be useful when testing. It might be a good idea, or it might not. It's up to you.

Note: Using Insight for purposes other than testing is probably a code smell.

Installation

Install the package via composer:

composer require code-distortion/insight --dev

Usage

Instantiate an Insight object:

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

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

$testObject will then act as if it is the original object, but gives you access to its protected and private methods and properties as well.

Read and write protected and private properties:

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

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

Call protected and private methods:

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

These can be useful while testing your code with phpunit:

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

Abstract classes

You can test abstract classes (and classes whose constructor is not public) by passing the class when instantiating an Insight object.

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

Note: When instantiating Insight with a class like this (instead of an object) you will only be able to access it's static methods and properties.

Note: To test other functionality of an abstract class you will need to have a concrete class that extends the abstract class, and use that instead.

Static methods and properties

PHP doesn't have __getStatic() or __setStatic() magic methods either which would help facilitate accessing protected properties.

Instead, Insight lets you access static methods and properties in the same way as regular methods and properties. Just add StaticProp or StaticMethod after the property or method name respectively:

// 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();

Misc

You can access the underlying object or class by accessing the ->insight property:

// 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'

Testing This Package

  • Clone this package: git clone https://github.com/code-distortion/insight.git .
  • Run composer install to install dependencies
  • Run the tests: composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

SemVer

This library uses SemVer 2.0.0 versioning. This means that changes to X indicate a breaking change: 0.0.X, 0.X.y, X.y.z. When this library changes to version 1.0.0, 2.0.0 and so forth, it doesn't indicate that it's necessarily a notable release, it simply indicates that the changes were breaking.

Treeware

This package is Treeware. If you use it in production, then we ask that you buy the world a tree to thank us for our work. By contributing to the Treeware forest you’ll be creating employment for local families and restoring wildlife habitats.

Contributing

Please see CONTRIBUTING for details.

Code of Conduct

Please see CODE_OF_CONDUCT for details.

Security

If you discover any security related issues, please email tim@code-distortion.net instead of using the issue tracker.

Credits

License

The MIT License (MIT). Please see License File for more information.