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