And*_*den 4 objective-c key-value-observing ocmock
如果我有一个对象使用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
Run Code Online (Sandbox Code Playgroud)
-
@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
Run Code Online (Sandbox Code Playgroud)
KVO和OCMock都在做一些小的运行时技巧,因此他们创建了你的实际类的私有子类,以便发挥他们的魔力.KVO正在做一个名为"isa- swizzling "的事情,而OCMock正在创建一个对象作为原始对象的转发目标.
每个系统都在它自己的小世界中脱颖而出,它自己的类与另一个系统无关.使用OCMock模拟KVO看起来与您的问题类似.我认为你应该能够通过告诉你的模拟来完成这项工作
[[myMock expect] observeValueForKeyPath:@"foo"
ofObject:myObserver
change:[OCMArg any]
context:[OCMArg any]];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
516 次 |
| 最近记录: |