2012-02-27 8 views
9

"InvalidArgumentException:現在のノードリストが空です。" PHPUnitによる機能テストの実行symfony2機能テストInvalidArgumentException:現在のノードリストが空です。

public function testAdd() 
{ 
    $client = static::createClientWithAuthentication('main'); 

    $crawler = $client->request('GET', 'en/manage'); 

    $send_button = $crawler->selectButton('submit'); 

    $form = $send_button->form(array(
     'PrCompany[email]' => '[email protected]', 
     'PrCompany[first_name]' => 'Anton', 
     'PrCompany[last_name]' => 'Tverdiuh', 
     'PrCompany[timezone]' => 'Europe/Amsterdam' 
    )); 

    $form['PrCompany[companies][1]']->tick(); 

    $client->submit($form); 


    $this->assertTrue($crawler->filter('html:contains("User is invited")')->count() > 0); 

} 
+0

あなたの問題をもっと理解するのに役立つ同様の質問があります。回答はまだありません... http://stackoverflow.com/questions/9662697/symfony2-functional-testing-crawler-not-working – Matt

+0

あなたは答えとして質問をしていませんので、私は自分自身を追加して、うまくいけば解決します質問 –

+0

私は '$ form ['PrCompany [companies]'] [1] - > tick();を使う必要があると思います。 '(引用符の外に[1]がある) – caponica

答えて

11

あなたはvar_dump($client->getResponse()->getContent());

を使用して問題をデバッグすることができますまた、私はあなたがこれを書くべきだと思う:

$crawler = $client->submit($form); 

そうでない場合は、あなたがの応答をテストすることがありますここで私が書いたテストがありますフォーム提出前の最初のURL。

0

CodeceptionをSymfony2モジュールで使用できます。 Symfony2の機能テストに柔軟なインターフェースを提供し、より良いデバッグ機能を備えています。

2

greg0ire @

var_dump($client->getResponse()->getContent()); 

ではなく、実際のコンテンツのリダイレクトページを返すかどうかをチェックし、書いたものにフォローアップとして。私もこれで苦しんでいた

$client->followRedirects(true); 
5

、そしてselectButtonメソッドは、このエラーを引き起こしたと思われた:もしそうなら、あなたはこれを追加することができます。

DOM Crawler docsを読んだところ、selectButtonメソッドは文字列引数として実際のボタンテキストを受け取ることがわかりました。したがって、あなたのボタンが「私のフォームを提出してください」であれば、そのテキストになります。

それは、以下に示すように、最終的に成功し、私はあなたがテストのために、この例に従うも推薦するテストを完了した後(ドキュメントから取られた)、あまりにも

A selectButton() method is available on the Crawler which returns another 
Crawler that matches a button (input[type=submit], input[type=image], 
or a button) with the given text. 

EDIT

を異なるパラメータがかかりますフォーム:

use Goutte\Client; 

$client = new Client(); 
$crawler = $client->request('GET', 'https://github.com/login'); 

$form = $crawler->selectButton('Log in')->form(); 
$form['login'] = 'symfonyfan'; 
$form['password'] = 'anypass'; 

$crawler = $client->submit($form); 
$this->assertTrue($crawler->filter('html:contains("Welcome Back")')->count() > 0); 

主な違いは、私が使用しているされているトン私はthe packagistから作曲してインストールし、彼グットバンドル、(私の場合、私は"fabpot/goutte": "1.0.*@dev"を追加しました)

+0

私は組み込みテストを使うという考えは、別のライブラリを必要としないことだと思います。あなたが組み込みのツールでそれをやることができたら、Goutteの登場は過度のように思えます。 – skoop

+0

@Andrew AtkinsonはテストフォームにGoutteが必要ですか?標準のチュートリアルに従うと、私はいつも「到達不能なフィールド」のエラーを受け取ります – Aris

+0

@skoop私の場合、私はGoutteを使用していて、うまく動作します。 –

0

クローラはフォーム要素が要求された見つけることができない場合に、このエラーが発生します。

$form = $this-> createFormBuilder($store) 
      ->add('storeNumber','text') 
      ->add('storeName','text') 
      ->add('save', 'submit') 
      ->getForm(); 

意志出力フィールド名のように:あなたが使用している、非常にトリッキーなときに実行する場合、例えば、フォームビルダ、それは別の入力名を作成するように、テストクラスで使用されるべきである

form_storeNumber 

$form=$crawler->selectButton('save')->form(); 
$form['form_storeNumber']='10'; 
1

質問がまだありません。私も同じ問題がありました。

私のケースでは、入力名がjavascriptによって即時に変更されるため、goutteはこのリクエストを実行できませんでした。

goutteがhtmlを受信すると、1つのフォームが表示されます。そして、あらかじめ埋め込まれたパラメータで提出するとき、フォーム入力要素は$form->setValues($params)と一致することができないので、\ InvalidArgumentExceptionがスローされました。

手作業でリクエストして解決しました。

// $form->setValues($data); 
// $this->getGoutte()->submit($form); 

$data = array(
    'input_name[key]' => 'value' 
); 
$this->getGoutte()->request($form->getMethod(), $form->getUri(), $params); 
0

私はSilexアプリケーションで同じ問題がありました。

<form> 
    ... 
    <input type="submit" value="Click Me"> 
</form> 
:私が代わりに

$buttonCrawler = $crawler->selectButton('input[type="submit"]'); 

を探していた、それを行うための正しい方法は、あなたのページに、ボタンたとえば

$buttonCrawler = $crawler->selectButton('value_of_the_button'); 


を与えることです


あなたのテストで:

$buttonCrawler = $crawler->selectButton('Click Me'); 
$form = $buttonCrawler->form(); 
... 
関連する問題