咨询/公开

0.1.0 2018-03-05 06:39 UTC

This package is auto-updated.

Last update: 2024-08-28 06:46:44 UTC


README

尽管大部分情况下只需要对类公共方法进行单元测试,但有时访问受保护或私有方法属性也是必要的或有帮助的。Exposer 提供了一种方便的方式来做到这一点,同时保持测试的清晰和简洁。

安装

通过 Composer 安装

 $ composer require konsulting/exposer

使用方法

考虑以下类

class ClassUnderTest
{
    protected $secret = 'My secret';
    
    protected static $anotherSecret = 'My static secret';
    
    protected function add($number1, $number2)
    {
        return $number1 + $number2;
    }
    
    protected static function multiply($number1, $number2)
    {
        return $number1 * $number2;
    }
}

有多种方法可以测试此类上的受保护方法和属性。

基本 Exposer

最直接的方法是使用 BaseExposer 类。主题必须传递到每个方法中,可以是实例或(字符串)类名。

use Konsulting\Exposer\BaseExposer;

// With an instance
BaseExposer::hasMethod(new ClassUnderTest, 'add');                          // true
BaseExposer::invokeMethod(new ClassUnderTest, 'add', [1, 1]);               // 2
BaseExposer::getProperty(new ClassUnderTest, 'secret');                     // 'My secret'

// Static context
BaseExposer::hasMethod(ClassUnderTest::class, 'multiply');                  // true
BaseExposer::invokeMethod(ClassUnderTest::class, 'multiply', [2,2]);        // 4
BaseExposer::getProperty(ClassUnderTest::class, 'anotherSecret');           // 'My static secret'

Exposer

Exposer 类允许使用类的不可访问方法属性,就像它们是公开的一样。

use Konsulting\Exposer\Exposer;

$exposer = Exposer::make(new ClassUnderTest);

$exposer->add(1, 1);                                // 2
$exposer->multiply(2, 2);                           // 4
$exposer->secret;                                   // 'My secret'
$exposer->anotherSecret;                            // 'My static secret'

// These non-magic methods are also available
$exposer->invokeMethod('add', [1, 1]);               // 2
$exposer->getProperty('secret');                     // 'My secret'

Exposer 还可以访问类的静态方法属性,而无需提供实例。

use Konsulting\Exposer\Exposer;

$exposer = Exposer::make(ClassUnderTest::class);

$exposer->multiply(2, 2);                           // 4
$exposer->anotherSecret;                            // 'My static secret'

$exposer->invokeMethod('multiply', [2, 2]);         // 4
$exposer->getProperty('anotherSecret');             // 'My static secret'

注意: 静态方法和属性可以从实例上下文中访问,但当然非静态方法和属性不能从静态上下文中访问。