実行中のコードが単体ケースであるかどうか、または次のような結果に対して別のコードを実行しないかどうかを確認したい:
if ( unit test case is running )
{
do something
}
else
{
do other thing
}
これについて何か考えはありますか?
実行中のコードが単体ケースであるかどうか、または次のような結果に対して別のコードを実行しないかどうかを確認したい:
if ( unit test case is running )
{
do something
}
else
{
do other thing
}
これについて何か考えはありますか?
これは、モックオブジェクトまたはその他のメカニズムを介して、このステートメントで回避しようとしているロジックパーツをシミュレートすることを試みる必要がある悪いアプローチです。
あなたの質問にはisUnittest
、テストセットアップとティアダウンで設定したような olean 変数を使用できますが、前述のように、これを行うことはお勧めしません。
これは私にとってはうまくいくようです(iOS 8、Xcode 6):
- (BOOL) isRunningTest {
return NSClassFromString(@"XCTestCase") != nil;
}
これは他の回答よりもクリーンで簡単だと思います。
もう 1 つの方法は、静的メソッドを介して制御されるカスタマイズ可能な動作をクラスに持たせ、静的ロード メソッドでテスト ケースがそのメソッドを呼び出すようにすることです。
ストーリーボードと、oauth を介した認証用の外部の安らかなサービスを使用して、同様の問題が発生しました。アプリ デリゲートは、appdelegate:didFinishLaunchingWithOptions に有効な oauth トークンがあるかどうかを確認し、そうでない場合は、プログラムで segue をトリガーして oauth ログインを実行します。しかし、これはテストケースでは望ましくありませんでした。これを解決するために、アプリ デリゲート内にログイン画面を無効にする静的メソッドを作成しました。これは私のアプリデリゲート内のコードです:
static Boolean showLoginScreen = TRUE ;
+ (void) disableLoginScreen
{
showLoginScreen = FALSE ;
NSLog(@"disabled login screen") ;
}
テスト ケースには、次のことを行うための load メソッドがありました。
// disable login screen for the test case
+ (void) load {
NSLog( @"now disabling login screen" ) ;
[XYZAppDelegate disableLoginScreen];
}
アプリケーションが初期化される前にテストケースクラスがロードされたため、これは機能しました。もちろん、アプリ デリゲート内でこのフラグの値をチェックして、ログイン セグエをトリガーする/トリガーしないようにする必要があります。私が試したが拒否された他の選択肢は次のとおりです。
テスト ターゲットでプリプロセッサ定義を作成します。ただし、コンパイラは、アプリケーション ソースではなく、このフラグを使用してテスト ケース ファイルのみをコンパイルします。http://www.innovaptor.com/blog/2013/09/02/xcode-preprocessor-macros-for-test-code.htmlを参照してください。
テスト ケースの static initialize メソッドを使用して、disable メソッドを呼び出します。テスト ケースの実行時に、テスト ケース クラスがロードされる前にアプリケーションが開始されます。詳細については、 http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/を参照してください。
UIAlertView
直接メッセージしないでください。代わりに、依存性注入を使用します。たとえば、次のようなプロパティです。
@property (strong, nonatomic) Class alertViewClass;
次に、アラートを作成するコードで実行できます
UIAlertView *alert = [[_alertViewClass alloc] initWithTitle:…etc…];
テスト コードで、別のクラスを挿入します。https://github.com/jonreid/JMRTestToolsを使用して指定しますJMRMockAlertView
。その後、アラート コールを でテストできますJMRMockAlertViewVerifier
。(実際、これにより、アラートのテスト主導の開発が可能になります。)
編集:最近、私はhttps://github.com/jonreid/ViewControllerPresentationSpyを使用しています