@chrispixの答えが私に別の方向に取り組むように促した後、私はしばらくこれに取り組みました. 私はこれから始めました:
id objectToObserve = [[TheClassBeingTested alloc] init];
id secondPropertyObserver = [OCMockObject mockForClass:[NSObject class]];
[[secondPropertyObserver expect] observeValueForKeyPath:@"secondProperty"
ofObject:objectToObserve
change:OCMOCK_ANY
context:[OCMArg anyPointer]];
[objectToObserve addObserver:secondPropertyObserver
forKeyPath:@"secondProperty"
options:NSKeyValueObservingOptionNew
context:NULL];
// Do something to modify objectToObserve's firstProperty
[secondPropertyObserver verify];
このテスト コードを実行すると、次のメッセージが表示されました。
OCMockObject[NSObject]: unexpected method invoked: isKindOfClass:<??>
expected: observeValueForKeyPath:@"firstProperty" ofObject:
調査を行ったところ、モック オブジェクトが予期していなかった呼び出しがクラス オブジェクト-isKindOfClass:
に渡されていることがわかりました。NSKeyValueObservance
応答をモックするために次のコードを追加しようとしましたが、スタック内の NSKeyValueWillChange で例外が発生し、YES
との値がNO
両方とも失敗します。EXC_BAD_ACCESS
BOOL returnVal = NO;
[[[secondPropertyObserver stub] andReturnValue:OCMOCK_VALUE(returnVal)] isKindOfClass:[OCMArg any]];
私はより慎重にステップを踏み、私のコードがこの例外を引き起こしていないことを発見しました.それはautoreleasepool
. その後、オブザーバーを削除する必要があることに気づきました。以下は、オブザーバーの削除を含む完全なソリューションです。
id objectToObserve = [[TheClassBeingTested alloc] init];
id secondPropertyObserver = [OCMockObject mockForClass:[NSObject class]];
BOOL returnVal = NO;
[[[secondPropertyObserver stub] andReturnValue:OCMOCK_VALUE(returnVal)] isKindOfClass:[OCMArg any]];
[[secondPropertyObserver expect] observeValueForKeyPath:@"secondProperty"
ofObject:objectToObserve
change:OCMOCK_ANY
context:[OCMArg anyPointer]];
[objectToObserve addObserver:secondPropertyObserver
forKeyPath:@"secondProperty"
options:NSKeyValueObservingOptionNew
context:NULL];
// Do something to modify objectToObserve's firstProperty
[secondPropertyObserver verify];
[objectToObserve removeObserver:secondPropertyObserver
forKeyPath:@"secondProperty"];