継承階層で編成された多数の Objective-C クラスがあります。それらはすべて、子の間で共有されるすべての動作を実装する共通の親を共有します。各子クラスはそれを機能させるいくつかのメソッドを定義し、親クラスはその子によって実装/オーバーライドされるように設計されたメソッドに対して例外を発生させます。これにより、Objective-C が抽象クラスを明示的にサポートしていなくても、実質的に親が疑似抽象クラスになります (それ自体では役に立たないため)。
この問題の核心は、OCUnit を使用してこのクラス階層を単体テストしていることです。テストは同様に構造化されています。つまり、共通の動作を実行する 1 つのテスト クラスと、テスト対象の各子クラスに対応するサブクラスがあります。ただし、(実質的に抽象化された) 親クラスでテスト ケースを実行することには問題があります。これは、主要なメソッドがないと、ユニット テストが見事に失敗するためです。(5 つのテスト クラスで共通のテストを繰り返すという代替案は、実際には受け入れられる選択肢ではありません。)
私が使用してきた理想的ではない解決策は、(各テスト メソッドで) インスタンスが親テスト クラスであるかどうかを確認し、そうである場合は救済することです。これにより、すべてのテスト メソッドでコードが繰り返されることになり、単体テストが非常に粒度が高い場合、この問題はますます厄介になります。さらに、そのようなすべてのテストは引き続き実行され、成功として報告されるため、実際に実行された意味のあるテストの数が歪められます。
私が望むのは、OCUnit に「このクラスではテストを実行せず、その子クラスでのみ実行してください」というシグナルを送る方法です。私の知る限り、それを行う方法は(まだ)ありません+(BOOL)isAbstractTest
。実装/オーバーライドできる方法に似ています。最小限の繰り返しでこの問題を解決するためのより良い方法についてのアイデアはありますか? OCUnit には、この方法でテスト クラスにフラグを立てる機能がありますか?それとも、レーダーを提出する時が来ましたか?
編集:問題のテスト コードへのリンクは次のとおりです。簡潔にするためのマクロのif (...) return;
使用を含め、メソッドを開始するためにが頻繁に繰り返されていることに注意してください。NonConcreteClass()