Вот мой тестовый класс;
<?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
Это только учебник, за которым я следую. Но он не работает, так что это расстраивает, потому что я точно следую ему.
Вы не можете проверить частный метод, вы можете использовать обходной путь и вызывать его посредством отражения, как описано в этой статье .
Это рабочий пример, основанный на статье:
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); }
с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); }
Публикация. Этот метод является общедоступным и доступен во всех подклассах.
Protected – свойство method / function / доступно родительскому классу и всем наследующим классам или мы называем их подклассами или дочерними классами.
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; } }