私は Symfony 6 プロジェクトのカスタムクラスで Symfony メーラーを使用しています。次のように、クラスのコンストラクターでタイプヒントを介してオートワイヤリングを使用しています。 リーリー
コントローラーでsendEmail() メソッドを呼び出すと、すべて問題ありません。
TransportException が正しく処理されるかどうかをテストしたいと思います。これを行うには、メーラーがテストで
TransportException をスローする必要があります。しかし、これは私が期待したようには機能しませんでした。
注: sendMail メソッドでは有効な電子メール アドレスのみが許可されるため、無効な電子メール アドレスを渡しても例外をスローできません。
1) シミュレートされた電子メール プログラムを使用する リーリー
結果として、Mailer クラスは
final であるためモックできません。
2) モック (またはスタブ) MailerInterface を使用します リーリー
エラーはありませんが、例外もスローされません。メールサービスは置き換えられていないようです。
3) カスタム MailerExceptionTester クラスを使用する リーリー
テスト中:リーリー
2)と同じ結果
4) Mailer の代わりに MailerInterface サービスを変更してみてください リーリー
エラー メッセージ:SymfonyComponentDependencyInjectionExceptionInvalidArgumentException: 「SymfonyComponentMailerMailerInterface」サービスはプライベートであるため、置き換えることはできません。
5) MailerInterface を public に設定します リーリー
エラー: インターフェース SymfonyComponentMailerMailerInterface をインスタンス化できません
6) MailerInterfaceのエイリアスを追加します リーリー
エラー メッセージ:SymfonyComponentDependencyInjectionExceptionInvalidArgumentException: 「SymfonyComponentMailerMailerInterface」サービスはプライベートであるため、置き換えることはできません。
MailerInterface サービスをテストで置き換えるにはどうすればよいですか?
最初の試行では、順序は正しいはずです。
リーリーテストされていませんが、クラスをオブジェクトとして取得しているため、サービスへの依存関係はモック化する前にすでに解決されています。これにより、まずコンテナ内のサービスが置き換えられ、次にコンテナから
MyClass
が取得されます。ただし、コンテナーの構築を完全にスキップすることもできます。 PhpUnitを使用するだけです。
リーリー私はこれをやろうとしていますが、あなたがすでに試したことに基づいて解決策を見つけたと思います。
私の
この設定により、Symfony Mailer サービスは以前とまったく同じように動作するはずですが、パブリックになっているため、必要に応じてコンテナ内で使用するクラスをオーバーライドできます。services.yaml
でmailer.mailer
サービスを再宣言し、テスト環境でパブリックに設定します。 リーリーリーリー
...テスト コードでは、テスト コンテナーを使用して、mailer.mailer
サービスを例外スロー クラスのインスタンスに置き換えました。 リーリー
これで、Mailer サービスを挿入するたびに、使用されるクラスはカスタム例外スロー クラスになります。