2015-10-14 118 views
1

我需要测试一个PHP Web应用程序。应用程序是一个程序代码块(在index.php中),由会话变量控制。通过控制流确定,其他文件也包含在程序块中(xy.inc)并修改会话变量。例如: -

header("Cache-Control: no-cache, must-revalidate"); 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Content-Type: text/html; charset=utf-8"); 
session_name("some_name"); 
session_start(); 

$_SESSION['some_key'] = 'some_value'; 
if($_SESSION['key1'] == 1){ 
    //include some file that in the end sets $_SESSION['key1'] = 0 
} 
else if($_SESSION['key2'] == 1){ 
    //Do something 
    $_SESSION['key2'] = 0; 
    $_SESSION['keyX'] = 'someOtherControlValue'; 
} 
//....Lots of code 
$SESSION['whatever'] = 'justAnotherValue'; 
//..more code, more $_SESSION checks and so on 

重构是没有选择(目前?),所以我只是想获得至少一些基本的测试运行,而不与编码器的“编程风格”的干扰。

在验收测试中是否有访问(和修改)$ _SESSION属性的方法? 我想为我的测试使用Codeception(但我打开替代方案)。

我要实现类似的信息(伪)

// setup test db etc. 
get('/'); 
assert(title == 'the title'); 
// change some control values 
$_SESSION['myDatabase'] = 'myTestdb'; 
$_SESSION['SomeKeyForFuctionIWantTest'] = 'myValue'; 
get('/'); 
assert($_SESSION['SomeKeyForFuctionIWantTest'] == 'myValue'); 
assert(getSomeElementCreatedByFunction() != null); 
assert(somethingIsInTheDatabase); 

我在PHP和会话管理(我在面向对象的编码)一点经验,任何人都可以帮我吗?

侧面说明:没有框架,MVC或其他任何参与

+0

你想改变中旬执行的会话数据或将装上的session_start一组不同的()就足够了?在第一种情况下:真的吗?为什么?在后一种情况下:也许编写和设置另一个[会话处理程序](http://docs.php.net/session_handler)将会起作用。 – VolkerK

+0

@VolkerK: 我需要在读取页面后读取和写入会话值(所以PHP已经执行),如 1.读取会话并修改var x 2.载入页面'/',它使用var x并设置一些其他的变数 3.读会话并修改变量 4.加载页面'/'(...) 我必须知道页面加载(会话状态)之间的当前状态 您能否给我关于如何将自定义SessionHandler集成到index.php中的最简单示例?它只是在类中调用session_set_save_handler(),还是必须修改index.php才能真正使用类? – mrong

回答

0

我发现了一个比较简单的,非常肮脏的黑客这一点。

测试时,我没有直接调用'/'(index.php),而是测试页面。 测试页面根据需要设置我的变量(可能需要“安全”的方式在这里注入我的测试变量..)。

# defined in /test.php - otherwise change path in include index 
<?php 
    header("Cache-Control: no-cache, must-revalidate"); 
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");  
    header("Content-Type: text/html; charset=utf-8"); 

    session_name("my_session_name"); 
    session_start(); 

    $_SESSION['TESTME'] = 'bla'; 

    session_write_close(); 
    session_destroy(); 

    include 'index.php'; 
?> 

在index.php中我可以看到$ _SESSION ['TESTME'] =='bla'。

以火攻火我想..