4

クラスメソッドが呼び出されたかどうかを判断できる必要があります。OCMock でこれを行うにはどうすればよいですか?

4

4 に答える 4

6

OCMock リリース 2.1 から、これはすぐにサポートされます。インスタンス メソッドをスタブ化するのと同じ方法で、クラス メソッドをスタブ化できるようになりました。

于 2013-03-16T20:23:33.197 に答える
3

1 つの方法は、独自のクラスのメソッドでクラス メソッドをラップすることです。それで、あなたのクラスが を呼び出さなければならないとしましょう[SomeOtherClass classMethod:someString]invokeClassMethod:次のように、クラスにメソッドを作成できます。

-(NSString *)invokeClassMethod:(NSString *)someString {
    return [SomeOtherClass classMethod:someString];
}

次に、テストで、部分的なモックを作成して期待しますinvokeClassMethod:

-(void)testSomething {
    id partialMock = [OCMockObject partialMockForObject:actual];
    [[[partialMock expect] andReturn:@"foo"] invokeClassMethod:@"bar"];

    [actual doSomething:@"bar"];

    [partialMock verify];
}

invokeClassMethod が呼び出されていないことを確認したい場合は、例外をスローできます。

-(void)testSomethingElse {
    id partialMock = [OCMockObject partialMockForObject:actual];
    [[[partialMock stub] andThrow:[NSException exceptionWithName:@"foo" reason:@"Should not have called invokeClassMethod:" userInfo:nil] invokeClassMethod:OCMOCK_ANY];

    [actual doSomething:@"bar"];
}

例外が呼び出された場合、テストは失敗しinvokeClassMethodます。

于 2011-04-11T03:44:50.380 に答える
2

あなたの質問へのコメントで zneak が言及したように、この回答を見てください。

そこのコメントから、このブロックベースのクラス メソッド スウィズリングの実装を確認してください。

OCMockやりたいことを直接サポートしているようには見えませんが、このソリューションは非常に優れています!

于 2012-07-02T04:18:22.290 に答える
1

または、次のクラスがあると仮定します。

@interface ABCCleverClass : NSObject
+ (id)specialMethod;
@end

このクラスメソッドをモックしたいとします。1 つのオプションは、テスト サポートを定義および実装するこのクラスにカテゴリを作成することです。次に、テスト対象のクラスのクラス メソッドの実装を、カテゴリのモック メソッドと交換できます。

#import <objc/runtime.h>

@interface ABCCleverClass (TestSupport)
+ (id)mockSpecialMethod;
@end

@implementation ABCCleverClass (TestSupport)

+ (void)load {
  Method original = class_getClassMethod([ABCCleverClass class], @selector(specialMethod));
  Method mocked = class_getClassMethod([ABCCleverClass class], @selector(mockSpecialMethod));
  method_exchangeImplementations(original, mocked);
}

+ (id)mockSpecialMethod {
  // Perform mock method. You may need to add more class methods
  // in order to configure this.
}

@end
于 2013-10-06T16:41:03.703 に答える