ここのチュートリアルに基づいています: フォーム イベントを使用してフォームを動的に生成する方法
イベント サブスクライバーを使用するフォームを作成しました。
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', 'text');
$blockSubscriber = new AddBlocksSubscriber($builder->getFormFactory());
$builder->addEventSubscriber($blockSubscriber);
}
// ...
}
これまでのところ、うまくいっています...ユニットテストを書くことにするまでは。;) 「new」キーワードの使用には問題があります。これは、モック サブスクライバー オブジェクトを使用できないためです。
考えられる解決策は次の 2 つです。
ここで説明されているように、テスト ヘルパー/クラス ポージングを使用します。これをしなければならないのは適切ではないと感じますが、実用的な回避策になる可能性があります。
依存性注入を使用します。たとえば、PageType フォーム コンストラクターがブロック サブスクライバーのインスタンスを必要とするようにします。ここで私が見つけた問題は、フォームの外部でサブスクライバー オブジェクトを作成するには、フォーム ビルダーのインスタンスも必要になることです。通常、フォームはコントローラーを呼び出すことによって構築される
createForm()
ため、通常、フォームの外部からビルダーを表示することはできません。
または、フォームの単体テストが本当に必要ですか、それともクローラーを使用した最終出力の機能テストで十分ですか?
いくつかの Symfony2 フォームを実装したことがある人なら、どのようにアプローチしたか知りたいです。