2013-07-03 19 views
4

如果我有一個使用國際志願者組織到某個對象,觀察一個屬性,然後創建該觀察者我不再收到任何通知的部分模仿的對象。爲什麼是這樣?爲什麼OCMock partialMock打破KVO?

這裏有一個小例子:

@interface TestPartialMockAndKVO : SenTestCase 
@end 
@implementation TestPartialMockAndKVO 

- (void)test { 
    // Should print "Changed!" when foo property is changed 
    MyObserver* myObserver = [[[MyObserver alloc] init] autorelease]; 

    // But with this line, there is no print out 
    [OCMockObject partialMockForObject:myObserver]; 

    [myObserver setFoo:@"change"]; 
} 

@end 

-

@interface MyObserver : NSObject  
@property (copy) NSString* foo; 
@end 
@implementation MyObserver 

- (id)init { 
    self = [super init]; 
    [self addObserver:self forKeyPath:@"foo" options:0 context:NULL]; 
    return self; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 
    NSLog(@"Changed!"); 
} 

- (void)dealloc { ... }  
@end 

回答

5

兩個志願和OCMock正在做一些小的運行時的技巧,從而他們爲了履行自己的魔術創建實際的類的私有子類。 KVO正在做一件叫做"isa-swizzling"的事情,而OCMock正在創建一個對象,使其成爲原始對象的forwarding target

每個系統是在自己的小世界之類的了,有自己的類,無關與其他。 Mocking KVO with OCMock看起來類似於您的問題。我想你應該能夠使這項工作只是告訴你的模擬到

[[myMock expect] observeValueForKeyPath:@"foo" 
           ofObject:myObserver 
           change:[OCMArg any] 
           context:[OCMArg any]]; 
+0

很好的答案,但是這真的很糟糕,我現在! – RyanM