2011-01-06 11 views
1

シングルトンクラスをインスタンス化できないようにテストケースを作成しようとしています。シングルトンのコンストラクタは次のように私のテストがある民間ように定義されていますPHPでのsimpletestでの致命的なエラーの発生方法

$this->expectError(); 
$test = new TestSingletonClassA(); 

代わりのエラーをキャッチし、試験に合格し、私は「PHPの致命的なエラーが発生します:プライベートシングルトンに呼び出し:: __構築物( ) '。私はまた、expectErrorのパラメータとしてPatternExpectationを渡そうとしましたが、どちらもうまくいきませんでした。何か提案はありますか?

いくつかの背景:PHP5.3、simpletest1.1a

答えて

-1

私はそれがそのように行うことが可能だとは思わない...致命的なエラーが、私はそれを理解してきたように捕捉可能ではありません。リフレクションを使用してコンストラクタメソッドを取得し、アクセス修飾子が "private"であることを確認することができます。

これはほとんどの言語でテストするのが難しいです。たとえば、java、c#、およびC++では、このコードをコンパイルすることさえできません。したがって、決して実行することができませんでしたD:

+0

このような状況では、テストケースではなく、正しいデザインに焦点を当てる必要があります。私の実装では、シングルトンは抽象クラスなので、サブクラスがパブリックコンストラクタを実装できないようにするために、プライベートコンストラクタをオーバーライドする方法が必要です。私はこれを行うことができる方法はありますか? –

+0

私はそうは考えていませんが、コンストラクタが呼び出されないようにするための他の方法があります。 1つの方法は、インスタンス化されたクラスを追跡している配列を持つことです。もう1つは、debug_stacktraceを使用して、コールスタックがいくつかのget_instanceメソッドから来ていることをチェックすることです。両方の戦略が基本クラスのコンストラクタ内で適用されます。また、私はあなたの基本クラスのコンストラクタを保護する必要があると思う、またはサブクラスのコンストラクタはおそらく親を呼び出すことができなくなります:: __ construct – davogotland

0

あなたのPHPコードが致命的なエラーを投げる場合、それはphpunitに到達することはありませんので、あなたはそれをテストするために "正しい"コードを書く必要があります。プライベートメソッドを呼び出すと、excepcionがスローされ、phpunitには到達しません。あなたはそれを変更する必要があります。

私はあなたがオブジェクトをモックする必要があると思います。この件についてはthese postsとしてください(それは4つの記事のシリーズです)、these slides(スライド#43から)

0

ユニットテストフレームワークでは、このようなことは検出できません。しかし、PHPTと同様の回帰テストフレームワークで行うことができます。

PHPUnitにフックするにはいくつかのフープを飛ばしなければならないかもしれませんが、残りのテストと統合する方法はおそらくあります。アサーションと、致命的なエラーが予想される特殊なケースを分けなければなりません。

関連する問題