objective-c - 如何模拟 UITextField 上的 isEditing getter?

标签 objective-c uitextfield ocmock

我一直在尝试模拟 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/

相关文章:

ios - 检测 UITextField 安全文本输入覆盖的文本

iphone - 带有参数的方法上的 OCMock 并返回一个值

objective-c - 我可以使用 OCMock 来测试父类(super class)是否被调用吗?

iphone - 卡号前 12 位数字应安全输入,其余 4 位数字正常

iphone - 将 UITextField 与 UITextView 一起使用时,textFieldShouldReturn 方法出现问题

ios - OCMock 方法名称冲突

ios - 超高优先级后台工作或 QUARTZ 精度

ios - Web View 非法接口(interface)限定符

objective-c - 为什么 Xcode 不建议 @synchronized?

ios - XCode 4.5 中 ARC 的 Phantom 内存泄漏,其中肯定调用了 dealloc 或 Instruments 问题?