3

私のXCodeプロジェクトには次のものがあります:

  • コントローラ
  • (シングルトン) databaseController

databaseController はコントローラー クラス内でインスタンス化されます。

この databaseController をモック オブジェクトに置き換えて、実際の databaseController に依存せずにコントローラー クラスが適切に機能することを確認するにはどうすればよいですか?

注:
- OCUnit は単体テストに使用されます。
- OCMock は、モック オブジェクトの作成に使用されます。

おまけの質問: databaseController がシングルトンではなかったら?

4

1 に答える 1

2

これが私が取ってきたアプローチです。あなたのシングルトンで:

static SomeManager *_sharedInstance = nil;

+(SomeManager *)sharedInstance {
    if (_sharedInstance == nil) {
        _sharedInstance = [[SomeManager alloc] init];
    }
    return _sharedInstance;
}

+(void)setSharedInstance:(SomeManager *)instance {
    _sharedInstance = instance;
}

次に、テストで:

-(void)testSomethingThatUsesSingleton {
    id mockManager = [OCMockObject mockForClass:[SomeManager class]];
    [SomeManager setSharedInstance:mockManager];
    [[mockManager expect] something];

    [controller doSomething];

    [mockManager verify];
    [SomeManager setSharedInstance:nil];
}

テストの最後にシングルトンを nil に戻すことを忘れないでください。通常、これはtearDown単体テストの基本クラスで行うため、各テストの後に自動的に行われます。

または、単体テストでオーバーライドsharedInstanceしてモック オブジェクトを返すカテゴリを作成することもできます。

于 2012-06-30T16:28:56.040 に答える