2

symfonyアプリケーション用のphpunitのテストスイートがあります。そのテストファイルでは、異なるテスト間にいくつかの依存関係があり、依存関係の間にDOMCrawlerオブジェクトを渡すので、毎回そこに移動する必要はありません。

しかし、私が行ったアプローチでは、これらの渡されたオブジェクトを使用してフォームを送信することはできないようですが、それらのリンクをクリックすることはできます。これには理由がありますか?私のデザインは貧弱ですか?もしそうなら、どのように変更すればよいですか?フィードバックは大歓迎です。以下にいくつかのコードを添付しました。

<?php

namespace someBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

/**
 * blah Controller Test
 * 
 */
class BlahControllerTest extends WebTestCase
{

    private $adminUrl;

    /**
     * Constructs basic information for a audit report controller test suite
     *
     */
    public function __construct()
    {
        $this->adminUrl = '/admin/';
    }

    /**
     * Starts a test suite 
     *
     * @return Crawler
     */
    public function testAdd()
    {
        // Create a new client to browse the application
        $client = static::createClient();

        // Go to site specific admin url
        $crawler = $client->request('GET', $this->adminUrl);
        $this->assertTrue(200 === $client->getResponse()->getStatusCode());

        // do stuff here

        // goes to edit page
        $crawler = $client->request('GET', $editPage);

        return $crawler;
    }

    /**
     * Tests the edit functionality
     *
     * @param Crawler $crawler Crawler for the show view
     *
     * @depends testAdd
     */
    public function testEdit($crawler)
    {
        // Create a new client to browse the application
        $client = static::createClient();

        //Line below is included if the crawler points to the show view
        //$crawler = $client->click($crawler->selectLink('Edit')->link());

        // Fill in the form and submit it
        $form = $crawler->selectButton('Edit')->form(array(
            $foo => $bar,
        ));

        // The following line doesn't work properly if testEdit is passed the
        // edit page. However, if it is passed the show page, and the 
        // edit link above is clicked, then the form will submit fine.
        $client->submit($form);
        $crawler = $client->followRedirect();

        // more code here...
    }
}
4

1 に答える 1

3

その理由は、拡張するクラスでわかるようにWebTestCase、分解が実装されているためです。

protected function tearDown()
{
    if (null !== static::$kernel) {
        static::$kernel->shutdown();
    }
}

このカーネルのシャットダウンには多くの影響があります。1つの効果はあなたが経験していることです。一度正確に何が起こっているのかを追跡しようとしましたが、どこにも行かず、シャットダウンが呼び出されるとクライアントとクローラーはかなり役に立たないことを頭に入れました。

Louisと同じことをお勧めします。テストを独立させます。クライアントと連携していないことに加えて、作成ページで何かが壊れたときのことを考えてください。実際には、ページ自体は問題ないかもしれませんが、編集ページのテストも失敗します。

Dependsは通常、応答をもう少し詳細にテストする場合など、オブジェクトをさらに検証するために使用されます。依存テストを使用して、最初のテストからの応答を返します。この場合、作成ページが壊れた場合、もちろん応答コンテンツが本来あるべきように見えないため、両方のテストが壊れても問題ありません。

于 2012-07-03T13:30:30.853 に答える