глобальные переменные равны нулю при использовании PHPUnit - PullRequest
9 голосов
/ 31 января 2012

Я помещаю тестирование PHPUnit в существующий проект.Глобальные постоянные переменные широко используются.В моем модуле тестовые функции терпят неудачу, потому что глобальные переменные равны нулю.Вот пример неудачного теста

static $secret_key = "a secret Key";
class secret_key_Test extends PHPUnit_Framework_TestCase
{
    function test_secret_key()
    {
        global $secret_key; 
        $this->assertEquals($secret_key, "a secret Key");   
    }
}

>> Failed asserting that 'a secret Key' matches expected null

Любая помощь будет принята с благодарностью

Обновление: я попытался удалить статическое и добавить

protected $backupGlobals = FALSE;

в классдекларация без успеха.

Ответы [ 3 ]

11 голосов
/ 13 марта 2012

Этот ответ не работает. Я задал практически идентичный вопрос здесь и получил ответ, который имеет больше смысла; Вы не можете перезаписать защищенное свойство $ backupGlobals в тестовом классе, который увидит PHPUnit. Если вы работаете в командной строке, кажется, что вы можете заставить Globals работать, создав файл конфигурации xml и установив для backupGlobals значение false.

РЕДАКТИРОВАТЬ: вам нужно объявить $ secret_key глобальным и присвоить ему значение в глобальном пространстве при использовании PHPUnit. PHP по умолчанию помещает глобально инициализированные переменные в глобальное пространство имен, но PHPUnit меняет это значение по умолчанию при резервном копировании глобальных переменных!

Следующие изменения должны произойти:

global $secret_key; // Declaring variable global in global namespace
$secret_key = "a secret Key"; // Assigning value to global variable

Ваш код должен работать.

5 голосов
/ 31 января 2012

Вы должны попросить phpunit не создавать резервные копии глобалов

protected $backupGlobals = FALSE;

, как сказано в оригинальной статье С. Бергманна: http://sebastian -bergmann.de / archives / 797-Global-Переменные-и-PHPUnit.html

0 голосов
/ 13 октября 2018

Вам нужно будет настроить глобальную переменную во время начальной загрузки вашего тестирования. Вот пример кода того, как я написал тест

    /**
     * Class to allow us set product on the fly
     */
    class Product
    {
        public function __call($method, $args)
        {
            if (isset($this->$method)) {
                $func = $this->$method;
                return call_user_func_array($func, $args);
            }
        }
    }

    /**
     * UssdShortcode Tester
     */
    class ShortCodeTester extends WP_UnitTestCase {

        protected  $product;

        public function setUp()
        {   
            $this->product            = new Product;
            $this->product->get_id    = function(){ return 50; };

            $GLOBALS['product']       = $this->product;
        }

        /**
         * A single example test.
         */
        function test_it_can_display_ussd_shortcode() {

            $displayer = new UssdShortCodeDisplayer;
            $expected  = view('show-product-short-code',['product_id' => $this->product->get_id() ]);
            $results   = $displayer->display($this->product->get_id());

            // $this->assertRegexp('/'.$expected.'/', $results);
            $this->assertEquals($expected,$results);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...