Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHPUnit时,全局变量为null_Php_Phpunit - Fatal编程技术网

使用PHPUnit时,全局变量为null

使用PHPUnit时,全局变量为null,php,phpunit,Php,Phpunit,我正在将PHPUnit测试放在一个现有的项目中。全局常量变量被广泛使用。在我的单元测试中,函数失败是因为全局变量为null。下面是一个失败测试的示例 static $secret_key = "a secret Key"; class secret_key_Test extends PHPUnit_Framework_TestCase { function test_secret_key() { global $secret_key; $this

我正在将PHPUnit测试放在一个现有的项目中。全局常量变量被广泛使用。在我的单元测试中,函数失败是因为全局变量为null。下面是一个失败测试的示例

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;

没有成功地备份到类声明。

您应该要求phpunit不要备份全局文件

protected $backupGlobals = FALSE;

正如S.伯格曼的原始文章所说:

这个答案行不通。我问了一个几乎相同的问题,最后得到了一个更有意义的答案;无法覆盖PHPUnit将看到的测试类中的受保护属性$backupGlobals。如果您在命令行上运行,那么似乎可以通过创建一个xml配置文件并将backupGlobals设置为false来让Globals工作

编辑:在使用PHPUnit时,您需要声明$secret_key并在全局空间中为其赋值。PHP默认将全局初始化的变量放入全局名称空间,但PHPUnit在备份全局变量时会更改此默认值

需要进行以下更改:

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

您的代码现在应该可以工作了。

您必须在引导测试时设置全局变量。下面是我如何编写测试的示例代码

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

呵呵,全局变量是你在开始单元测试时应该去掉的,因为隔离和状态。顺便说一下,你可能想说
global$secret\u key=“a secret key”
不是静态的,不是吗?应该删除静态的关键字
global
仅在函数/方法内部有意义。@zerkms是的,不应使用全局变量,但不幸的是,phpunit还删除本地启动的变量(在特定的单元测试类中受保护)。这是错误的,应由开发人员决定通过setUp()和tearDown()清除哪些变量。例如,当我测试web服务时,我只需要一个登录名,我想在许多测试中重用它——但phpunit总是删除启动的实例,并强制我多次进行身份验证。这是错误的。@lubosdz:这是隔离,或者确保它们在引导过程中由
bootstrap.php
或它在PHPUnit开始执行实际测试方法之前加载的某个模块设置。@rp90:上面的代码包含奇怪的
static
,您还没有解释
static
是关于解决我的问题的。我正在使用PHPv7.3.0和PHPUnit 7.3.5。谢谢!