我一直在尝试模拟 UITextField
上的一个简单属性:
@property(nonatomic,readonly,getter=isEditing) BOOL 编辑;
我尝试过两种方式来模拟
1.) 使用完整的类方法混合技术(通常对于基于类的方法我会这样做)
- (void)swapOutTextFieldIsEditing
{
method_exchangeImplementations(
class_getClassMethod([UITextField class], @selector(isEditing)),
class_getClassMethod([self class], @selector(isEditingEnabledMock))
);
}
- (void)resetTextFieldIsEditing
{
method_exchangeImplementations(
class_getClassMethod([self class], @selector(isEditingEnabledMock)),
class_getClassMethod([UITextField class], @selector(isEditing))
);
}
+ (BOOL)isEditingEnabledMock {
return isEditingMockResult;
}
2.) 使用自定义 ocmock 帮助器创建自定义“并返回 bool”方法
- (id)andReturnBool:(BOOL)aValue {
NSValue *wrappedValue = nil;
wrappedValue = [NSValue valueWithBytes:&aValue
objCType:@encode(BOOL)];
return [self andReturnValue:wrappedValue];
}
遗憾的是,这两种技术都失败了,我几乎可以肯定这是因为这是 UITextField
上的一个普通属性,标记为带有 setter/getter 的只读(以前在 iOS 上从未见过)
**by 失败了以下 NSLog
总是返回 (null) - 意味着我无法 stub 此
- (IBAction)next
{
for (int i = 0; i<[self.fieldsArray count]; i++) {
NSLog(@"is this field being edited? %@", [[self.fieldsArray objectAtIndex:i] isEditing]);
}
}
这是我的基本 stub 语法(与上面一起使用)
id firstField = [OCMockObject niceMockForClass:[UITextField class]];
[[[firstField stub] andReturnBool:YES] isEditing];
有人知道另一种方法来 stub 这个结果吗?如果不是上面列出的两种方法呢?我在这里做错了什么吗?
提前谢谢
最佳答案
当您使用此 stub 设置时
id firstField = [OCMockObject niceMockForClass:[UITextField class]];
[[[firstField stub] andReturnBool:YES] isEditing];
您还在用firstField做什么?您确定其他对象与模拟实例 firstField 交互,还是与 XIB 文件中实例化的 UITextField 的真实实例交互?
对于无法注入(inject)模拟并且必须处理在其他地方创建的实例的情况,OCMock 提供部分模拟。这些允许您在现有对象上 stub 方法。在你的情况下,你可以这样做:
id firstField = ... // somehow get a reference to the actual field object
id firstFieldMock = [OCMockObject partialMockForObject:firstField];
[[[firstFieldMock stub] andReturnBool:YES] isEditing];
之后,当另一个对象在 firstField 上调用 isEditing 时,模拟将拦截它。
关于objective-c - 如何模拟 UITextField 上的 isEditing getter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10973323/