Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Php Can';t单元测试:$\u会话在运行每个测试之前清空_Php_Unit Testing_Phpunit - Fatal编程技术网

Php Can';t单元测试:$\u会话在运行每个测试之前清空

Php Can';t单元测试:$\u会话在运行每个测试之前清空,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,我不能对我的代码进行单元测试 $\每次运行下一个测试时,会话都会清除。 当我运行testStartProductSession()时,我的对象向$\u会话变量添加了一些数据。但是,当我运行下一个测试方法(testSessionIdIsKept())时,$\u会话再次为空 单元测试时,$\u会话似乎成为局部变量 我不知道还能做什么。请检查以下输出波形: // session_start() on bootrap.php; class MC_Session_ProductTest extends

我不能对我的代码进行单元测试

$\每次运行下一个测试时,会话都会清除。 当我运行testStartProductSession()时,我的对象向$\u会话变量添加了一些数据。但是,当我运行下一个测试方法(testSessionIdIsKept())时,$\u会话再次为空

单元测试时,$\u会话似乎成为局部变量

我不知道还能做什么。请检查以下输出波形:

// session_start() on bootrap.php;

class MC_Session_ProductTest extends PHPUnit_Framework_TestCase
{

    /**
     * @return MC_Session_Product
     */
    public function getObject()
    {
        // make getInstance() return new instance instead of singleton instance
        MC_Session_Product::$isUnityTest = true;
        $object = MC_Session_Product::getInstance();
        $object->getWsClient()->setServerListUrl(SERVER_LIST_URL);
        return $object;
    }

    /**
     * All tests pass
     * @depends testSetParam
     */
    public function testStartProductSession()
    {
        $developerId = PARAM_DEVELOPER_ID;
        $productCode = PARAM_PRODUCT_CODE;
        $productVersion = PARAM_PRODUCT_VERSION;
        $platform = PARAM_PLATAFORM;
        $deviceType = PARAM_DEVICE_TYPE;
        $locale = PARAM_LOCALE;

        try {
            $object = $this->getObject();
            $object->startSession($developerId, $productCode, $productVersion,
                                  $platform, $deviceType, $locale);
            $this->assertTrue($object->sessionStarted());
        } catch (Exception $e) {
            $this->fail('Fail to start session: ' . $object->getLastUrl());
        }

        echo "\$_SESSION in testStartProductSession(): ", print_r($_SESSION, 1);
        return $object;
    }

    /**
     * Test fails because $_SESSION is empty again
     * @depends testStartProductSession
     */
    public function testSessionIdIsKept(MC_Session_Product $lastObject)
    {
        echo "\$_SESSION in testSessionIdIsKept(): ", print_r($_SESSION, 1);
        $object = $this->getObject();
        // fails
        $this->assertTrue($lastObject->sessionStarted());
        $this->assertTrue($object->sessionStarted());
        $this->assertEquals($lastObject->getSessionId(), $object->getSessionId());
        return $object;
    }
}

/* ###### Output


$_SESSION in testStartProductSession():
Array
(
    [__MC] => Array
        (
            [MC_Session_Product] => Array
                (
                    [keyOne] => 'valueOne'
                    [sessionId] => 'someId'
                )

        )

)
$_SESSION in testSessionIdIsKept():
Array
(
)

*/

我假设在每次测试之前都会调用一个方法。你可以在那里设置cookie。在java中,您有@Before.

注释,而不是将$\u会话作为单元测试的依赖项,您应该参数化每个函数需要的会话部分。然后可以轻松地模拟单元测试中的参数。以您目前尝试的方式执行此操作太困难,并且会降低代码的可测试性。这将需要更改当前代码,但这将改进代码并使其更易于测试。

PHPUnit会在每个测试方法之前将所有全局变量(包括
$\u SESSION
)重置为它们的起始值。您可以通过将
$backupGlobals
实例属性重写为
false
来禁用测试用例的此功能。这在
setUp()
方法中不起作用

class MyTest extends PHPUnit_Framework_TestCase
{
    protected $backupGlobals = FALSE;

    // ...
}

有关更多详细信息,请参阅。

这是我尝试进行单元测试的第一个项目。我一点也不知道如何用模拟对象替换$\会话(数组)。我不能引用那个。您是否有实现该目标的代码示例?非常感谢您的帮助。在PHPUnit中,您创建了一个名为
setUp()
——与JUnit.Kudos中的非注释方式相同!工作得很有魅力。非常感谢你!