Domanda

Sto cercando di effettuare alcuni test dell'unità utilizzando una funzione SetCookie () in un buone buone phpstorm.Ma ottengo ogni volta un errore seguente:

Cannot modify header information - headers already sent by (output started at /tmp/phpunit.php:418)
.

Probabilmente il motivo di questo errore è stampato ('un po' di testo ') con flush () prima della chiamata SetCookie ().Ma la lavagna viene eseguita in un file /tmp/phpunit.php generato da phpstorm.Mentre SetCookie () è chiamato dalle mie fonti.Quindi non posso modificare il file generato per fare qualche tipo di buffering di output.Inoltre c'è un altro momento: phpstorm esegue /tmp/phpunit.php script come questo:

/usr/bin/php /tmp/phpunit.php -config /var/www/.../protected/tests/phpunit.xml d /var/www/.../protected/tests/unit/user
.

Aiutatemi a soluzioni alternative a questo problema.Come posso eseguire direttamente i test universitari da Phpstorm?

È stato utile?

Soluzione

Un modo possibile in questo modo è usare una sostituzione "simpatica" per la funzione setcookie().

Questa è una tecnica comune nei test dell'unità, in cui si desidera verificare qualcosa che si basa su una classe o una funzione esterna che non si desidera influire sul test corrente.

Il modo per farlo sarebbe quello di creare una definizione di funzione stub per setcookie() all'interno del tuo codice di prova unità. Questo sarebbe quindi chiamato durante il test invece della funzione setcookie() reale. Esattamente come implementato questa funzione stub dipende da te e dipenderebbe da ciò che il tuo codice lo usa per.

Il problema principale che avrai con questo approccio è che PHP non ti consente di sovrascrivere le funzioni esistenti per impostazione predefinita - se si tenta di questa installazione PHP standard, riceverai "Errore: la funzione non può essere rideggiata" .

La soluzione a questo problema è PHP estensione runkit , che è esplicitamente progettato per questo tipo di test e ti permette di Rinominare una funzione esistente , compresi quelli incorporati.

Se si configura l'installazione PHP nell'ambiente di test per includere l'estensione Runkit, sarai in grado di eseguire questo tipo di test.

Spero che ti aiuti.

Altri suggerimenti

Ho trovato una soluzione più semplice.Considera questa classe:

class Cookie
{
    public function set($name, $value)
    {
        return setcookie($name, $value);
    }
}
.

Il test proietta l'errore descritto nella domanda a meno che non si imposta l'annotazione @ RuninseparateProcess

class CookieTest
{
    /**
     * @runInSeparateProcess
     */
    function test_set()
    {
        $cookie = new Cookie;
        $this->assertTrue($cookie->set('mycookie', 'myvalue');
    }
}
.

Invece di cercare di impostare le intestazioni dei cookie effettioni (che falliranno perché il contenuto è già stato inviato);Per scopi di test, è possibile impostare semplicemente il cookie SuperGlobal esplicitamente:

$_COOKIE['mycookie']=myvalue';
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top