8

ArrayCollection のメンバーを追加するフォームの機能テストには、次のステートメントがあります。

$form['client[members][1][fname]'] = 'Benny';

フィールド名は DOM インスペクタで検証されました。

この行のコンソール出力は次のとおりです。

InvalidArgumentException: Unreachable field "members"

G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:459
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:496
G:\Documents\workspace\sym\vendor\symfony\symfony\src\Symfony\Component\DomCrawler\Form.php:319
G:\Documents\workspace\sym\src\Mana\ClientBundle\Tests\Controller\ClientControllerTest.php:57

ArrayCollection メンバーの追加をテストするには、どのメソッドを使用する必要がありますか?

必要に応じて編集します (注意: リダイレクトに従うことがオンになっています):

    //link to trigger adding household member form
    $link = $crawler->selectLink('Add household member')->link();
    $crawler = $client->click($link);
    $form = $crawler->selectButton('Add client')->form();
    $form['client[members][1][fname]'] = 'Benny';
    $form['client[members][1][dob]'] = "3/12/1999";
    $crawler = $client->submit($form);
    $this->assertTrue($crawler->filter('html:contains("Client View Form")')->count() > 0);
4

4 に答える 4

9

私はちょうど同じ問題を抱えていましたが、少し調査した後、私に役立つ解決策を見つけました。 コレクション フォーム タイプからフィールドを削除するための解決策 この投稿はまさにあなたが探していたものではありません。これは要素を削除するためのものであり、新しい要素を追加するためのものではありません。しかし、原則は同じです。その代わりに私がした$form->setValues() ... $form->getPhpValues()こと私は配列を作成し、それを投稿しました

以下の例configurationsでは、フォームのフィールドはCollection

    $submitButton = $crawler->selectButton(self::BUTTON_ADD_APPLICATION);
    $form = $submitButton->form();
    $values = array(
        'Setup' => array(
            '_token' => $form['Setup[_token]']->getValue(),
            'name'   => 'My New Setup',
            'configurations' => array(
                0 => array(
                    'country' => 'HUN',
                    'value'   => '3',
                ),
                1 => array(
                    'country' => 'GBR',
                    'value'   => '0',
                ),
            ),
        ),
    );

    $client->request($form->getMethod(), $form->getUri(), $values);

それが役に立てば幸い!そして、元のソリューションの sstok に感謝します!

于 2013-03-21T10:56:04.640 に答える
5

submit()これは、メソッドからわずかに変更されたコードを呼び出すことで実行できます。

// Get the form.
$form = $crawler->filter('button')->form();

// Get the raw values.
$values = $form->getPhpValues();

// Add fields to the raw values.
$values['task']['tag'][0]['name'] = 'foo';
$values['task']['tag'][1]['name'] = 'bar';

// Submit the form with the existing and new values.
$crawler = $this->client->request($form->getMethod(), $form->getUri(), $values,
    $form->getPhpFiles());

// The 2 tags have been added to the collection.
$this->assertEquals(2, $crawler->filter('ul.tags > li')->count());

この例のニュース値の配列は、次のフィールドを持つフォームに対応していますname

<input type="…" name="FORM_NAME[COLLECTION_NAME][A_NUMBER][FIELD_NAME_1]" />
<input type="…" name="FORM_NAME[COLLECTION_NAME][A_NUMBER][FIELD_NAME_2]" />

このコードでは、既存のフィールド (トークンを含む) が既にフォームに存在するため、すべてのフィールドを追加する必要はありません。

フィールドの数 (インデックス) は関係ありません。PHP は配列をマージしてデータを送信します。Symfony はこのデータを対応するフィールドに変換します。

コレクションから要素を削除することもできます。

// Get the values of the form.
$values = $form->getPhpValues();

// Remove the first tag.
unset($values['task']['tags'][0]);

// Submit the data.
$crawler = $client->request($form->getMethod(), $form->getUri(),
    $values, $form->getPhpFiles());

// The tag has been removed.
$this->assertEquals(0, $crawler->filter('ul.tags > li')->count());

ソース: http://symfony.com/doc/current/book/testing.html#adding-and-removing-forms-to-a-collection

于 2016-03-18T13:05:15.010 に答える
2

JavaScript でフォームを変更すると、symfony テスト フレームワークでテストできません。この理由は、symfony が提供する DomCrawler は静的 HTML のみを取得して解析し、グラフィカル ユーザー インターフェイス (主に JavaScript) を備えたブラウザーによって行われる操作を考慮に入れないためです。

JavaScript を多用するプロジェクトをテストする必要がある場合は、ブラウザーのエンジン (Selenium など) を使用するか、JavaScript を解釈して DOM ですべての変更を実行できるフレームワーク (Zombie.js など) を使用する必要があります。

これを行うための優れたフレームワークは Mink です。これは、テスト フレームワークと、リクエストを実行して結果を解析する実際のクライアントとの間のレイヤーです。非常に単純な PHP HTML パーサー (symfony で使用される DomCrawler に似ています)、Selenium、Zombie.js などで動作する API を提供します。

于 2013-03-19T22:18:24.820 に答える
0

同様の問題がありましたが、私の場合、正しいクローラーを使用していなかったことが原因であることに気付きました。前のページのクローラーを少し異なるフォームで使用していました。したがって、これは私の場合にうまくいった解決策を提供するのに適した場所だと思います.

適切な Web ページで新しいクローラーを取得することで機能します

    $crawler = $client->getCrawler();
    //processing the form
    // ...

間違いを避けるために、構文を使用します

$crawler = $client->submitForm('Add client', [
            'client[members][1][fname]' => 'Benny',
            'client[members][1][dob]' => "3/12/1999",
        ]);
于 2021-11-03T02:31:11.010 に答える