書き直されたタイトルは「テスト目的で Symfony メーラーをシミュレートするにはどうすればよいですか?」です。
P粉739706089
P粉739706089 2023-12-13 09:42:22
0
2
529

私は 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 サービスをテストで置き換えるにはどうすればよいですか?

P粉739706089
P粉739706089

全員に返信(2)
P粉704066087

最初の試行では、順序は正しいはずです。

リーリー

テストされていませんが、クラスをオブジェクトとして取得しているため、サービスへの依存関係はモック化する前にすでに解決されています。これにより、まずコンテナ内のサービスが置き換えられ、次にコンテナから MyClass が取得されます。

ただし、コンテナーの構築を完全にスキップすることもできます。 PhpUnitを使用するだけです。

リーリー
いいねを押す +0
P粉226667290

私はこれをやろうとしていますが、あなたがすでに試したことに基づいて解決策を見つけたと思います。

私の services.yamlmailer.mailer サービスを再宣言し、テスト環境でパブリックに設定します。 リーリー

この設定により、Symfony Mailer サービスは以前とまったく同じように動作するはずですが、パブリックになっているため、必要に応じてコンテナ内で使用するクラスをオーバーライドできます。

あなたが書いたカスタム Mailer クラスをコピーしました...

リーリー

...テスト コードでは、テスト コンテナーを使用して、

mailer.mailer サービスを例外スロー クラスのインスタンスに置き換えました。 リーリー これで、Mailer サービスを挿入するたびに、使用されるクラスはカスタム例外スロー クラスになります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート