NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Testováná privátnách metod | Selenium

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Lukáš Novák:12.8.2017 11:06

Zdravím, potřeboval bych otestovat pár privátních metod v třídě MainCotroller.
Obsah mojí testovací třídy vypadá následovně:

use Controllers\MainController;

class MainControllerTest extends PHPUnit_Framework_TestCase
{

        /** @var  MainController */
        private $mainController;

        /** @before */
        protected function before()
        {
                \Codeception\Util\Autoload::addNamespace('Controlles',__DIR__ . '/../../Controllers');
                $this->mainController = new MainController();
        }

        function testDataParse()
        {
                $this->assertEquals(['test'] ,$this->invokeMethod($this->mainController, 'parseURL', ['/test/']));
        }

        /**
         * 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);
        }
}

Při spuštění mi to ale nahlásí chybu:

ReflectionException : Method parseURL does not exist

Celkem mě to udivuje, protože v MainController mám

private function parseURL($url)
{  ...

Nevíte proč mi to háže takovou chybu, když na funkce existuje?

 
Odpovědět
12.8.2017 11:06
Avatar
ConflictBoy
Člen
Avatar
ConflictBoy:14.8.2017 1:02

No zřejmě proto, že je metoda privátní a skript se k ní tak nedostane :)
Takže si přepiš definici metody třeba na toto -

public function parseURL($url) {}

Viz
https://www.interval.cz/…viditelnost/

Nahoru Odpovědět
14.8.2017 1:02
I'm programmer, I have no life :)
Avatar
Odpovídá na Lukáš Novák
Petr Štechmüller:14.8.2017 9:11

Ahoj, ty privátní metody obvykle musí volat nějaká veřejná metoda, takže musíš test napsat tak, aby jsi zavolal všemi možnými způsoby tu veřejnou metodu díky které se pak zavolá i ta privátní.

Jsi si jistý, že proměnná $reflection opravdu obsahuje třídu?
http://php.net/…cessible.php

Nahoru Odpovědět
14.8.2017 9:11
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.