Mock toi pas !

Tests unitaires encore et toujours et j’avoue sécher depuis quelques heures sur un problème qui ne devrait, si je lis correctement la doc, ne pas en être un !

Pour résumer :

Je veux modifier le comportement d’une fonction native de PHP, à savoir get_magic_quotes_gpc(), pour lui faire renvoyer une valeur précise afin de compléter mes couvertures de tests. Du coup j’ai simplement ajouté cette ligne au début d’un test d’une des méthodes statiques qui l’utilise (indirectement) :

$this->function->get_magic_quotes_gpc = true;

Sauf que bien évidemment j’ai droit à un beau message d’erreur à l’exécution :

Error: The function you are trying to mock already exists: 'get_magic_quotes_gpc'. This may be because you are trying to mock a function from a class in the root namespace.

Z’avez une idée du pourquoi du comment, sachant que je ne trouve rien dans la doc, pas plus dans l’historique du salon IRC d’Atoum (freenode/##atoum) et encore moins ailleurs sur le net…


Je rajoute un peu de contexte :

Soit le code à tester :

public static function trimRequest()
{
    if (!empty($_GET)) {
        array_walk($_GET, array('self', 'trimRequestInVar'));
    }
    if (!empty($_POST)) {
        array_walk($_POST, array('self', 'trimRequestInVar'));
    }
    if (!empty($_REQUEST)) {
        array_walk($_REQUEST, array('self', 'trimRequestInVar'));
    }
    if (!empty($_COOKIE)) {
        array_walk($_COOKIE, array('self', 'trimRequestInVar'));
    }
}

private static function trimRequestInVar(&$value, $key)
{
    if (is_array($value)) {
        foreach ($value as $k => &$v) {
            if (is_array($v)) {
                self::trimRequestInVar($v, $k);
            } else {
                if (get_magic_quotes_gpc()) {
                    $v = stripslashes($v);
                }
                $v = trim($v);
            }
        }
    } else {
        if (get_magic_quotes_gpc()) {
            $value = stripslashes($value);
        }
        $value = trim($value);
    }
}

Et le code de test :

public function testTrimRequestInVar()
{
    $_GET['single']      = 'single';
    $_GET['trim_single'] = ' trim_single ';
    $_GET['multiple']    = array('one ', 'two', ' three', ' four ', array(' five '));

    $_POST['post']       = ' test  ';
    $_REQUEST['request'] = ' test\\\'n\\\'test ';
    $_COOKIE['cookie']   = ' test  ';

    $this->function->get_magic_quotes_gpc = true;

    \http::trimRequest();
    $this
        ->array($_GET)
        ->string['single']->isEqualTo('single')
        ->string['trim_single']->isEqualTo('trim_single')
        ->array['multiple']
        ->string[0]->isEqualTo('one')
        ->array['multiple']
        ->string[1]->isEqualTo('two')
        ->array['multiple']
        ->string[2]->isEqualTo('three')
        ->array['multiple']
        ->string[3]->isEqualTo('four')
        ->array['multiple']
        ->array[4]
        ->string[0]->isEqualTo('five')
        ->array($_POST)
        ->string['post']->isEqualTo('test')
        ->array($_REQUEST)
        ->string['request']->isEqualTo('test\'n\'test')
        ->array($_COOKIE)
        ->string['cookie']->isEqualTo('test');
}

Je cherche à tester les lignes 25 et 32 du code à tester et c’est la raison pour laquelle, dans le code de test je positionne un mock pour la fonction get_magic_quotes_gpc (ligne 11).

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/13717

Haut de page