5

init メソッドで使用されるメソッドをスタブするにはどうすればよいですか?

私のクラスの関連メソッド:

- (id)init
{
    self = [super init];
    if (self) {
        if (self.adConfigurationType == AdConfigurationTypeDouble) {
             [self configureForDoubleConfiguration];
        }
        else {
            [self configureForSingleConfiguration];
        }
    }
    return self;
}

- (AdConfigurationType)adConfigurationType
{
    if (adConfigurationType == NSNotFound) {
        if ((random()%2)==1) {
            adConfigurationType = AdConfigurationTypeSingle;
        }
        else {
            adConfigurationType = AdConfigurationTypeDouble;
        }
    }
    return adConfigurationType;
}

私のテスト:

- (void)testDoubleConfigurationLayout
{
    id mockController = [OCMockObject mockForClass:[AdViewController class]];
    AdConfigurationType type = AdConfigurationTypeDouble;
    [[[mockController stub] andReturnValue:OCMOCK_VALUE(type)] adConfigurationType];

    id controller = [mockController init];

    STAssertNotNil([controller smallAdRight], @"Expected a value here");
    STAssertNotNil([controller smallAdRight], @"Expected a value here");
    STAssertNil([controller largeAd], @"Expected nil here");
}

私の結果:

キャッチされていない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'OCMockObject[AdViewController]: 予期しないメソッドが呼び出されました: smallAdRight '

では、OCMockObject の AdViewController にアクセスするにはどうすればよいでしょうか。

4

1 に答える 1

13

メソッドを使用する場合mockForClass:は、モック化されたクラスで呼び出されるすべてのメソッドに対して、スタブ化された実装を提供する必要があります。最初のテストで [controller smallAdRight] を使用して呼び出しを含めます。

代わりに、niceMockForClass:モックされていないメッセージを無視するメソッドを使用できます。

もう 1 つの方法は、メソッドをインスタンス化してAdViewControllerから、メソッドを使用してその部分モックを作成することpartialMockForObject:です。このようにして、コントローラ クラスの内部が作業の主要な部分を行います。

ただ... AdViewController またはそれを使用するクラスをテストしようとしていますか? クラス全体をモックしてから、正常に動作するかどうかをテストしようとしているようです。特定の値が注入されたときに期待どおりに動作することをテストしたい場合AdViewController、最良のオプションはおそらく次のpartialMockForObject:方法です。

- (void)testDoubleConfigurationLayout {     
  AdViewController *controller = [AdViewController alloc];
  id mock = [OCMockObject partialMockForObject:controller];
  AdConfigurationType type = AdConfigurationTypeDouble;
  [[[mock stub] andReturnValue:OCMOCK_VALUE(type)] adConfigurationType];

  // You'll want to call init after the object have been stubbed
  [controller init]

  STAssertNotNil([controller smallAdRight], @"Expected a value here");
  STAssertNotNil([controller smallAdRight], @"Expected a value here");
  STAssertNil([controller largeAd], @"Expected nil here");
}
于 2011-09-14T12:17:59.577 に答える