Невозможно выполнить модульный тест: $ _SESSION очищается перед каждым тестом - PullRequest
4 голосов
/ 03 октября 2011

Я не могу проверить мой код модулем.

$ _ SESSION очищается при каждом запуске следующего теста. Когда я запускаю testStartProductSession (), мой объект добавляет некоторые данные в переменную $ _SESSION. Но когда я запускаю следующий тестовый метод (testSessionIdIsKept ()), $ _SESSION снова пусто.

Похоже, $ _SESSION становится локальной переменной при модульном тестировании.

Я не знаю, что еще делать. Пожалуйста, проверьте вывод ниже:

// 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
(
)

*/

Ответы [ 3 ]

2 голосов
/ 03 октября 2011

Вместо того, чтобы делать $ _SESSION зависимостью для ваших модульных тестов, вы должны параметризовать те части сеанса, которые нужны каждой функции.Тогда вы можете легко смоделировать параметры в вашем модульном тесте.Делать это так, как вы пытаетесь, слишком сложно и делает ваш код менее тестируемым.Это потребует изменения вашего текущего кода, но это улучшит ваш код и сделает вещи более тестируемыми.

1 голос
/ 04 октября 2011

PHPUnit сбрасывает все глобальные переменные - включая $_SESSION - в их начальные значения перед каждым методом тестирования.Вы можете отключить это для тестового случая, переопределив свойство $backupGlobals instance на false.Это не работает из метода setUp().

class MyTest extends PHPUnit_Framework_TestCase
{
    protected $backupGlobals = FALSE;

    // ...
}

Подробнее см. Глобальные переменные и PHPUnit .

0 голосов
/ 03 октября 2011

Я бы предположил, что есть метод, который вызывается перед каждым тестом.Вы можете настроить печенье там.В Java у вас есть аннотация @ Before.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...