tags:

views:

36

answers:

2

i have stuck at a point for quite some time

i have to test a function where the parameters are extracted from the $_POST global array.

look at the following for a better clarification

my function looks like this

function getUsers()
       {

           extract($_POST);
       $usersQry=$this->db->query("select user from user_table where org_type='".$orgType."'")
       return $usersQry;
}

in the above $orgType is an index in $_POST array.

as no parameter is passed to the function getuser() i can not pass parameters as array from the test file.see below

 $testdata=$this->users_model->getUsers($orgType);// i can not go for this option in test file

please post some alternatives and help me to get out of this juncture.

thanks.

+1  A: 

Technically there is nothing preventing you from changing $_POST inside your test code, before calling getUsers(). Its just an array. $_POST['orgType'] = something will work.

You may also want to enable backupGlobals, as described here: www.phpunit.de

Anti Veeranna
+1  A: 

The code you provided is quite buggy, so it is hard to test.

  1. You are unable to manipulate (e.g. fake, mock) $_POST values outside the method
  2. You allow to set any variable via extract
  3. You pass unvalidated data to SQL query (SQL injection)

Better approach would be:

function getUsers($post = null) 
{
    if (null === $post) {
         $post = $this->getSanitizedPost();
    }

    if (isset($post['orgType']) {
         throw new Exception('Missing required parameter…');
    }

    $orgType = $post['orgType'];
    $usersQry = $this->db->query("select user from user_table where org_type='".$orgType."'");

    return $usersQry;
}
/**
 * Assert exception…
 */
function testHasRequiredParamter() 
{
     $post = array('param1'=>'val1');
     $users = $this->tested->getUsers($post);
     ...
}
takeshin