无法进行单元测试:$ _SESSION在每次测试运行前清空
我无法单元测试我的代码。
$ _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
(
)
*/
PHPUnit将所有全局变量(包括$_SESSION
)重置为每个测试方法之前的初始值。通过将$backupGlobals
实例属性覆盖为false
,可以禁用此功能以用于测试用例。这从setUp()
方法不起作用。
class MyTest extends PHPUnit_Framework_TestCase
{
protected $backupGlobals = FALSE;
// ...
}
查看Global Variables and PHPUnit了解更多详情。
我会假设在每次测试之前都会调用一个方法。你可以在那里设置cookie。在java中,你有注解@Before。
在PHPUnit中,您创建了一个名为'setUp()'的方法 - 与JUnit中的非注释方式相同。 –
而不是使$ _SESSION成为您的单元测试的依赖项,您应该参数化每个函数所需的会话部分。然后您可以轻松地模拟单元测试中的参数。以目前的方式来做这件事太困难了,并且使得你的代码不易测试。这将需要更改当前的代码,但它会改进您的代码并使其更具可测试性。
那么,这是我尝试单元测试的第一个项目。我不知道如何用模拟**对象替换$ _SESSION(一个数组)。我不能参考。你有没有实现这个目标的代码示例?非常感谢您的帮助。 – Marcelo
Kudos!像魅力一样工作。非常感谢你! – Marcelo