0

Symfony2 の Form 型をテストしたいです。カスタム フォーム タイプがあり、テストは次のようになります。

/**
 * @param  \Acme\UserBundle\Entity\User $user
 */
function let(\Acme\UserBundle\Entity\User $user)
{
    $this->beConstructedWith($user);
}

function it_is_initializable()
{
    $this->shouldHaveType('Acme\UserBundle\Form\Type\RegistrationFormType');
}

/**
 * @param \Symfony\Component\Form\FormBuilderInterface $builder
 */
function it_builds_form(\Symfony\Component\Form\FormBuilderInterface $builder)
{
    $this->buildForm($builder, []);
}

致命的なエラー: 非オブジェクトでメンバー関数 add() を呼び出します buildForm メソッドで FormBuilderInterface から $this->add メソッドを呼び出します どうすればこれを解決できますか?

4

1 に答える 1

4

フォーム コードを投稿していませんが、問題はビルダーの add() メソッドが使用する流暢なインターフェイスにあると思われます。次のように add() を複数呼び出す場合:

$builder
    ->add('username')
    ->add('email')
    ->add(...)
    ->add(...)
    ->add('save', 'submit');

次に、最初の add() の後で問題が発生します。これは、オブジェクトが返されないためです (したがって、「オブジェクト以外でメンバー関数 add() を呼び出す」というエラー メッセージが表示されます)。

流暢なスタイルを使用している場合は、$builder コラボレーターを「トレーニング」する必要があります。これにより、phpspec/mockery が add() の連続した呼び出しに対して同じビルダー オブジェクトを返すことができます。

$builder->add(Argument::any(), Argument::any())->willReturn($builder);
$this->buildForm($builder, []);

Symfony 2 フォームは phpspec テストの最適な候補ではない可能性があると思います。クラスのパブリック API のみをテストし、所有していないコード (つまり、フレームワーク/サードパーティ ライブラリ) をテストしたくないからです。 .

テストしているフォームの種類は、生成される実際のフォームではなく、必要なときにフォームを構築するために使用される「青写真」に似ているため、フォームに特定のフィールドまたはオプションがあることをテストするのは難しいと思います。これはコードによって呼び出されないため、フォーム フレームワークがフォーム タイプを処理するときに自動的に発生します。

実際のフォームを作成する作業はビルダー内で行われます。このフォーム タイプ仕様のコンテキストでは、これは実際のビルダー オブジェクトではなくコラボレーターです (また、テストするコードではありません)。

于 2014-07-03T01:15:28.973 に答える