2

基本 AppDelegate クラス内のビュー コントローラーで状態ベースのテストを行うための「ベスト プラクティス」/「テスト摩擦の少ない」方法を探しています。現在、以下は、クラスのメソッド内で何かが発生したときに、自分の UIViewController で (ocmock を使用して) スタブする簡単な方法を提供します。

-(FirstViewController *)getFirstViewController
{
    if (self.viewController1)
    { return self.viewController1; }

    self.viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];

    return self.viewController1;
}

私が持っている最初の質問 - これは、テスト用に独自のモック ビュー コントローラーをスタブ化/注入する有効な方法ですか? (うまく機能しているようですが、これがプロが今日の状態ベースのテストを行っている方法であるかどうかはわかりません)

私が持っている次の質問 - ビュー コントローラーの 1 つのコピーをこのようにメモリに保持することは有効ですか (アプリの存続期間中に一度だけゼロから作成するだけです)。

**注 - これを依存性注入しますが、私の init はすでにナビゲーション コントローラーとタブ バー コントローラーを注入するだけで十分に大きいため、悲しいことに、この大きなクラスのオプションではありません

4

3 に答える 3

1

依存性注入では、init メソッドを使用してすべての依存性を注入する必要はありません。それが好まれる理由がありますが、それは別の議論です。

-setFirstViewController: メソッドをクラスに追加するだけです。テストでそのメソッドを使用して、モックを挿入します。そのメソッドがアプリ内にあるのが気に入らない場合は、テスト コードでカテゴリを使用してメソッドを追加できます。

于 2012-03-18T18:47:15.950 に答える
1

ルート ビュー コントローラーの場合は、アプリ デリゲートのプロパティにする必要があります。

@interface MyAppDelegate : NSObject <UIApplicationDelegate>
@property(retain)FirstViewController *firstViewController;
@end

@implementation MyAppDelegate
@synthesize firstViewController;
...
@end

テストしているメソッドが初期化するメソッドでない限り、firstViewController遅延読み込みアプローチは必要ありません。テストでアプリ デリゲートを取得し、インスタンスを作成FirstViewControllerしてデリゲートのプロパティに割り当て、テストを定義するだけです。

-(void)testSomething {
    MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    FirstViewController *firstViewController = [[FirstViewController alloc] init];
    appDelegate.firstViewController = firstViewController;

    // test some app delegate method
    ...
}

テスト対象のコントローラーをモックアウトしたい場合は、それも同様に実行できます。

-(void)testSomething {
    MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    id mockController = [OCMockObject mockForClass:[FirstViewController class]];
    appDelegate.firstViewController = mockController;

    [[mockController expect] someControllerMethod];

    // test some app delegate method
    ...

    [mockController verify];
}
于 2012-03-23T06:34:07.527 に答える
0

この種のテストでは、私はあなたのように、まあ、少し違ったものにします。

最初のビュー コントローラーの遅延読み込みは、プロパティ内にカプセル化されます。

.h ファイル内

@interface AppDelegate {
    FirstViewController *viewController1_;
}

それで

@property (nonatomic, readonly) FirstViewController viewController1;

.m ファイル内

- (FirstViewController *)viewController1 {
    if (!viewController1_) {
        viewController1_ = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    }

    return viewController1_;
}

2番目-モックオブジェクトを挿入したい場合は、テストコードでKVCを使用します

[appDelegateUnderTest setValue:mockViewController forKey:@"viewController1_"];

よろしく、

于 2012-03-20T22:27:03.347 に答える