3

Silexアプリケーションの単体テストを作成しようとしています。単体テストクラスは次のようになります。

class PageTest extends WebTestCase {

    public function createApplication() {
        $app = require __DIR__ . '/../../app/app.php';
        $app['debug'] = true;

        $app['session.storage'] = $app->share(function() {
            return new MockArraySessionStorage();
        });

        $app['session.test'] = true;

        unset($app['exception_handler']);
        return $app;
    }

    public function testIndex() {
        $client = $this->createClient();
        $client->request('GET', '/');
        $this->assertTrue($client->getResponse()->isOk());
    }

}

要求しようとしているサイレックスルートは次のようになります。

$app->get('/', function() use($app) {
    $user     = $app['session']->get('loginUser');

    return $app['twig']->render('views/index.twig', array(
        'user'           => $user,
    ));
});

これにより、RuntimeExceptionが発生します。ヘッダーがすでに送信されているため、セッションの開始に失敗しました。\ Symfony \ Component \ HttpFoundation \ Session \ Storage \ NativeSessionStorage.php:142にあり、$ app['session']->getのルートからの行を含むバックトレースがあります。

NativeSessionStorageでセッションを開始する前に発生した出力は、実際にはPHPUnitの出力情報であるように見えます。これは、エラーメッセージの前に取得する唯一の出力であるためです。

PHPUnit 3.7.8 by Sebastian Bergmann.

Configuration read from (PATH)\phpunit.xml

E.......

phpunitからのこのエラー出力は、実際のテストメソッドが実行される前の出力で発生するため、少し混乱しています。私は他のテストメソッドを実行していないので、このエラーによるものである必要があります。

セッション変数を使用するサイレックスルートでPHPUnitを機能させるにはどうすればよいですか?

4

2 に答える 2

5

以下のコメントの後に編集

OK、私は同じ問題を抱えており、1 時間ウェブを閲覧した後、なんとかテストに合格しました。

Silex 2.0-dev では、クラス$app['session.test'] = trueからの呼び出しWebTestCaseはまったく機能せず、ブートストラップで行う必要があります。

それを達成する方法はたくさんありますが、そのうちの 2 つを次に示します。

1/とphpunit.xml.dist

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
     backupStaticAttributes="false"
     colors="true"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     processIsolation="false"
     stopOnFailure="false"
     syntaxCheck="false"
     bootstrap="./app.php"
>
    <php>
        <env name="TEST" value="true" />          //-> This is the trick
    </php>
    <testsuites>
        <testsuite name="Your app Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
</phpunit>

次にブートストラップで

$app = new \Silex\Application();

...

$app->register(new \Silex\Provider\SessionServiceProvider(), [
    'session.test' => false !== getenv('TEST')
]);

...

return $app;


Silex\Application2/コンストラクターに環境を渡すことができるよう に拡張することにより

namespace Your\Namespace;

class YourApp extends \Silex\Application
{
    public function __construct($env, array $params = array())
    {
        $this['env'] = $env;

        parent::__construct($params);
    }
}

次に、ブートストラップで

$env = // Your logic ...

$app = new \Your\Namespace\YourApp($env);

...

$app->register(new \Silex\Provider\SessionServiceProvider(), [
    'session.test' => 'test' === $app['env'],
]);

...

return $app;

お役に立てば幸いです、乾杯!

于 2015-11-30T18:13:45.207 に答える
0

わかりました、私は答えを見つけました。Silex のバグのようです。

標準の FormServiceProvider を登録する前に小枝拡張機能を登録すると、問題が発生しました。twig エクステンション内の何かが原因ではありません。エクステンション クラス全体を空のメソッドだけに分解すると、エラーが発生します。

そのため、少なくとも FormServiceProvider の後で (バグが修正されるまで)、Silex アプリ オブジェクトでの小枝拡張の登録は常にプロバイダーの登録後に行う必要があります。

于 2012-11-28T08:15:04.180 に答える