6

かなり良いIDEPhpStormでsetcookie()関数を使用していくつかの単体テストを作成しようとしています。しかし、毎回次のエラーが発生します。

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

おそらく、このエラーの理由は、setcookie()を呼び出す前にflush()を指定したprint('some text')です。ただし、フラッシュは、PhpStormによって生成された/tmp/phpunit.phpファイルで実行されます。setcookie()が私のソースから呼び出されている間。そのため、生成されたファイルを編集して、ある種の出力バッファリングを行うことはできません。また、別の瞬間があります。PhpStormは次のように/tmp/phpunit.phpスクリプトを実行します。

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

この問題を回避するのを手伝ってください。PhpStormから直接ユニットテストを実行するにはどうすればよいですか?

4

4 に答える 4

6

これを回避する1つの可能な方法は、関数の「モック」置換を使用することsetcookie()です。

これは単体テストの一般的な手法であり、現在のテストに影響を与えたくない外部クラスまたは関数に依存するものをテストする必要があります。

setcookie()これを行う方法は、単体テストコード内のスタブ関数定義を作成することです。これは、実際のsetcookie()関数ではなく、テスト中に呼び出されます。このスタブ関数をどのように実装するかはあなた次第であり、コードがそれを何に使用するかによって異なります。

このアプローチで発生する主な問題は、PHPではデフォルトで既存の関数をオーバーライドできないことです。これを標準のPHPインストールで試行すると、「エラー:関数を再宣言できません」というメッセージが表示されます。

この問題の解決策は、PHPのRunkit拡張機能です。これは、この種のテスト用に明示的に設計されており、組み込み関数を含む既存の関数の名前を変更できます。

Runkit拡張機能を含めるようにテスト環境でPHPインストールを構成すると、この種のテストを実行できるようになります。

お役に立てば幸いです。

于 2011-03-29T10:22:51.397 に答える
6

もっと簡単な解決策を見つけました。このクラスを検討してください。

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

アノテーション@runInSeparateProcessを設定しない限り、テストは質問で説明されているエラーをスローします

class CookieTest
{
    /**
     * @runInSeparateProcess
     */
    function test_set()
    {
        $cookie = new Cookie;
        $this->assertTrue($cookie->set('mycookie', 'myvalue');
    }
}
于 2017-04-27T18:25:36.573 に答える
0

プロキシクラスを作成してモックすることなく、互いに回避策を講じますが、動作するコードレベルを変更する必要があります。

function setTestableCookie(string $key, $value): void
{
    $_COOKIE[$key] = $value;

    if (headers_sent() === false) {
        setcookie(
          $key,
          $value,
          ... other cookie params ...
        );
    }
}

このようにして、単体テストで機能し、本番コードに適切なCookieパラメーターを設定します。

于 2020-06-24T09:25:39.803 に答える
-2

実際のCookieヘッダーを設定しようとする代わりに(コンテンツがすでに送信されているため失敗します)。テストの目的で、COOKIEスーパーグローバルを明示的に設定するだけです。

$_COOKIE['mycookie']=myvalue';
于 2018-12-26T17:02:38.933 に答える