【问题标题】:Testing Private Methods Not Working测试私有方法不起作用
【发布时间】:2015-07-09 09:30:17
【问题描述】:

这是我的测试课;

<?php
namespace stats\Test;

use stats\Baseball;

class BaseballTest extends \PHPUnit_Framework_TestCase
{

  public function setUp() {
    $this->instance = new Baseball();
  }

  public function tearDown() {
    unset($this->instance);
  }

  public function testOps() {
    $obp = .363;
    $slg = .469;
    $ops = $this->instance->calc_ops($obp, $slg); //line 23

    $expectedops = $obp + $slg;

    $this->assertEquals($expectedops, $ops);
  }

}

这是我的棒球课;

<?php
namespace stats;

class Baseball
{
  private function calc_ops($slg,$obp)
  {
   return $slg + $obp;
  }
}

我在运行测试时不断收到此错误;

Fatal error: Call to private method stats\Baseball::calc_ops() from context 'stats\Test\BaseballTest' in /media/sf_sandbox/phpunit/stats/Test/BaseballTest.php on line 23

这只是我正在关注的一个教程。但它不起作用,所以这很令人沮丧,因为我完全按照它。

【问题讨论】:

  • 你不能测试私有方法。它必须是公开的或受保护的。
  • 我通过测试类中的公共方法对其进行测试。也许我的标题有点误导
  • @mike3875 您不能从对象外部访问私有或受保护的方法。他们需要公开......
  • @mike3875 您的测试方法是public,是的,但是您尝试访问Baseballprivate 方法。如果call_opsprivate,你不能做$this-&gt;instance-&gt;calc_ops($obp, $slg),因为你不在对象中
  • 在仔细查看教程后,我可以看出他为了表达自己的观点而略微捏造了它。他只是假装它会起作用。有点烦人。过了一会儿,他继续创建一个 invokeMethod “因为它更好”

标签: php unit-testing phpunit


【解决方案1】:

您无法测试私有方法,您可以使用解决方法并通过反射调用它,如 article 中所述。

这是一个基于文章的工作示例:

class BaseballTest extends \PHPUnit_Framework_TestCase
{

    public function setUp() {
        $this->instance = new Baseball();
    }

    public function tearDown() {
        unset($this->instance);
    }

    public function testOps() {
        $obp = .363;
        $slg = .469;
//        $ops = $this->instance->calc_ops($obp, $slg); //line 23
        $ops = $this->invokeMethod($this->instance, 'calc_ops', array($obp, $slg));

        $expectedops = $obp + $slg;

        $this->assertEquals($expectedops, $ops);
    }

    /**
     * Call protected/private method of a class.
     *
     * @param object &$object    Instantiated object that we will run method on.
     * @param string $methodName Method name to call
     * @param array  $parameters Array of parameters to pass into method.
     *
     * @return mixed Method return.
     */
    public function invokeMethod(&$object, $methodName, array $parameters = array())
    {
        $reflection = new \ReflectionClass(get_class($object));
        $method = $reflection->getMethod($methodName);
        $method->setAccessible(true);

        return $method->invokeArgs($object, $parameters);
    }

【讨论】:

    【解决方案2】:

    Public – 该方法是公开可用的,所有子类都可以访问。
    受保护的——方法/函数/属性对父类和所有继承类都可用,或者我们称它们为子类或子类。
    Private – 方法是私有的,只对父类/基类可用。

    您只能在类中测试私有方法并调用使用私有方法的公共方法。

    class Baseball
    {
        public function testMethod()
        {
            $a = 1;
            $b = 2;
            return $this->calc_ops($a, $b);
        }
    
        private function calc_ops($slg,$obp)
        {
            return $slg + $obp;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2014-08-10
      相关资源
      最近更新 更多