测试私有方法不起作用
Testing Private Methods Not Working
这是我的测试Class;
<?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);
}
}
这是我的棒球 Class;
<?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
这只是我正在关注的教程。但是它不起作用,所以令人沮丧,因为我正在严格按照它进行操作。
您无法测试私有方法,您可以使用变通方法并通过反射调用它,如 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);
}
Public – 该方法 public 仅可用,所有子 class 都可以访问。
受保护——方法/函数/属性 对父 class 和所有继承 classes 可用,或者我们称它们为 subclasses 或子 classes .
Private – 该方法是私有的,仅对父 class / base class.
可用
您只能在 class 中测试私有方法并调用使用私有方法的 public 方法。
class Baseball
{
public function testMethod()
{
$a = 1;
$b = 2;
return $this->calc_ops($a, $b);
}
private function calc_ops($slg,$obp)
{
return $slg + $obp;
}
}
这是我的测试Class;
<?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);
}
}
这是我的棒球 Class;
<?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
这只是我正在关注的教程。但是它不起作用,所以令人沮丧,因为我正在严格按照它进行操作。
您无法测试私有方法,您可以使用变通方法并通过反射调用它,如 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);
}
Public – 该方法 public 仅可用,所有子 class 都可以访问。
受保护——方法/函数/属性 对父 class 和所有继承 classes 可用,或者我们称它们为 subclasses 或子 classes .
Private – 该方法是私有的,仅对父 class / base class.
您只能在 class 中测试私有方法并调用使用私有方法的 public 方法。
class Baseball
{
public function testMethod()
{
$a = 1;
$b = 2;
return $this->calc_ops($a, $b);
}
private function calc_ops($slg,$obp)
{
return $slg + $obp;
}
}