コントローラーの1つのアクションでCakeEmailクラスを使用して電子メールを送信しています。電子メールコードを追加する前に正常に機能していたこのコントローラーの単体テストがあります。メールを追加した後、次のエラーが発生します。
SocketException:メールを送信できませんでした。
これは、ローカルマシンから電子メールを送信する方法がないという事実によるものです。
したがって、Config / email.phpのEmailConfigクラス内に2つの異なる構成オプションを含めることをお勧めします(データベース構成ファイルの動作と同様)。デフォルトはメールトランスポートを使用し、テストはデバッグトランスポートを使用します。これに関する問題は、データベース構成とは異なり、Cakeはテスト中に2つを自動的に切り替えないことです。
私が考えた唯一のことは、EmailConfigクラスにコンストラクターを追加して、単体テストであるかどうかをテストすることですが、チェックがどうあるべきかわかりません。
これに沿った何か:
class EmailConfig {
public $default = array(
'transport' => 'Mail'
);
public $test = array(
'transport' => 'Debug'
);
public function __construct() {
if ($isUnitTesting) {
$this->default = $this->test;
}
}
}
上で提案した私の方法は良い考えでしょうか?そうでない場合、単体テスト中に電子メールに別のトランスポートを使用できる他の方法はありますか?
更新-2012年4月10日
私はこれを間違った方法で行っていたと思います。この回答を見ると、構成$default
がデフォルトでロードされていないようですが、メソッドを呼び出すCakeEmail::config()
か、コンストラクターで指定する必要があります。だから私はこれが今私に2つの選択肢を残していると思います:
- コントローラーで、単体テストを行っているかどうかを確認してから(どういうわけか?)、「test」構成を使用します。
- 電子メールを送信できるようにコンピューターをセットアップします。
私はむしろ最初のことをしたいのですが、単体テストであるかどうかをチェックしてコントローラーのアクションを肥大化させずにこれを行う方法がわかりません。これを行うのは間違っているようです。