>백엔드 개발 >PHP 튜토리얼 >phpunit 단일 테스트에서 개인 메소드 처리 호출

phpunit 단일 테스트에서 개인 메소드 처리 호출

WBOY
WBOY원래의
2016-07-29 09:10:001480검색

문제 배경: 싱글 테스트에서 흔히 발생하는 문제 被侧类中的private方法无法直接调用가 있습니다. Xiaoyan은 처리 중에 反射改变方法权限,进行单测을 전달하고 이를 공유하며 코드를 직접 업로드합니다.

간단한 테스트 클래스

단 하나의 비공개 메서드로 간단한 테스트 클래스를 생성합니다.

<code><?php

/**
 * 崔小涣单测的基本模板。
 *
 * @author cuihuan
 * @date 2015/11/12 22:15:31
 * @version $Revision:1.0$
 **/

class MyClass {

    /**
     * 私有方法
     *
     * @param $params
     * @return bool
     */
    private function privateFunc($params){
        if(!isset($params)){
            return false;
        }
        echo "test success";
        return $params;
    }
}</code>

단일 테스트 코드

<code><?php
/***************************************************************************
 *
 * $Id: MyClassTest T,v 1.0 PsCaseTest cuihuan Exp$
 *
 **************************************************************************/

/**
 * 崔小涣单测的基本模板。 
 * 
 * @author cuihuan
 * @date 2015/11/12 22:09:31
 * @version $Revision:1.0$
 **/

<strong>require</strong>_once ('./MyClass.php');

class MyClassTest extends PHPUnit_Framework_TestCase {
    const CLASS_NAME = 'MyClass';
    const FAIL       = 'fail';

    protected $objMyClass;
    
    /**
     * @brief setup: Sets up the fixture, for example, opens a network connection.
     *
     * 可以看做phpunit的构造函数
     */
    public function setup() {
        date_default_timezone_set('PRC');
        $this->objMyClass = new MyClass();
    }

    /**
     * 利用反射,对类中的private 和 protect 方法进行单元测试
     *
     * @param $strMethodName  string  :反射函数名
     * @return ReflectionMethod obj   :回调对象
     */
    protected static function getPrivateMethod($strMethodName) {
        $objReflectClass = new ReflectionClass(self::CLASS_NAME);
        $method          = $objReflectClass->getMethod($strMethodName);
        $method->setAccessible(true);
        return $method;
    }


    /**
     * @brief :测试private函数的调用
     */
    public function testPrivateFunc()
    {
        $testCase = 'just a test string';

        // 反射该类
        $testFunc = self::getPrivateMethod('privateFunc');
        $res = $testFunc->invokeArgs($this->objMyClass, array($testCase));

        $this->assertEquals($testCase, $res);
        $this->expectOutputRegex('/success/i');
        
        // 捕获没有参数异常测试
        try {
             $testFunc->invokeArgs($this->transfer2Pscase, array());
        } catch (<strong>Exception</strong> $expected) {
            $this->assertNotNull($expected);
            return true;
        }

        $this->fail(self::FAIL);
    }
    
}</code>

실행 결과

<code>cuihuan:test cuixiaohuan$ phpunit MyClassTest.php 
PHPUnit 4.8.6 by Sebastian Bergmann and contributors.


Time: 103 ms, Memory: 11.75Mb

OK (1 test, 3 assertions)</code>

키워드코드 분석

, 테스트 중인 클래스의 메소드에 대한 리플렉션 호출과 동시에 返回方法之前处理方法的接入权限为true 비공개 함수 메소드에 액세스할 수 있습니다.

<code>/**
 * 利用反射,对类中的private 和 protect 方法进行单元测试
 *
 * @param $strMethodName  string  :反射函数名
 * @return ReflectionMethod obj   :回调对象
 */
protected static function getPrivateMethod($strMethodName) {
    $objReflectClass = new ReflectionClass(self::CLASS_NAME);
    $method          = $objReflectClass->getMethod($strMethodName);
    $method->setAccessible(true);
    return $method;
}
</code>

[재인쇄 시 명시해 주세요: phpunit 단일 테스트에서 개인 메서드 호출 신뢰할 수 있는 Cui Xiaoyan]

위에서는 require, 코드 분석, Exception을 포함하여 phpunit 단일 테스트에서 private 메소드를 호출하는 과정을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.