5

実行中のコードが単体ケースであるかどうか、または次のような結果に対して別のコードを実行しないかどうかを確認したい:

    if ( unit test case is running )
{
do something
}
else
{
do other thing
}

これについて何か考えはありますか?

4

4 に答える 4

3

これは、モックオブジェクトまたはその他のメカニズムを介して、このステートメントで回避しようとしているロジックパーツをシミュレートすることを試みる必要がある悪いアプローチです。

あなたの質問にはisUnittest、テストセットアップとティアダウンで設定したような olean 変数を使用できますが、前述のように、これを行うことはお勧めしません。

于 2013-01-15T07:46:05.447 に答える
1

これは私にとってはうまくいくようです(iOS 8、Xcode 6):

- (BOOL) isRunningTest {
    return NSClassFromString(@"XCTestCase") != nil;
}

これは他の回答よりもクリーンで簡単だと思います。

于 2015-05-18T14:53:19.750 に答える
1

もう 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];
}

アプリケーションが初期化される前にテストケースクラスがロードされたため、これは機能しました。もちろん、アプリ デリゲート内でこのフラグの値をチェックして、ログイン セグエをトリガーする/トリガーしないようにする必要があります。私が試したが拒否された他の選択肢は次のとおりです。

于 2014-11-29T12:04:33.783 に答える
1

UIAlertView直接メッセージしないでください。代わりに、依存性注入を使用します。たとえば、次のようなプロパティです。

@property (strong, nonatomic) Class alertViewClass;

次に、アラートを作成するコードで実行できます

UIAlertView *alert = [[_alertViewClass alloc] initWithTitle:…etc…];

テスト コードで、別のクラスを挿入します。https://github.com/jonreid/JMRTestToolsを使用して指定しますJMRMockAlertView。その後、アラート コールを でテストできますJMRMockAlertViewVerifier。(実際、これにより、アラートのテスト主導の開発が可能になります。)

編集:最近、私はhttps://github.com/jonreid/ViewControllerPresentationSpyを使用しています

于 2013-01-15T22:33:12.757 に答える