나는 @ 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
클래스 개체가 전달됩니다.
다음 코드를 추가하여 응답을 모의하려고 시도했지만 YES
및 NO
값은 모두 스택의 NSKeyValueWillChange 예외와 함께 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"];
출처
2012-03-08 13:24:54
Dov