Objective c 如何在UITextField上模拟isEditing getter?
我一直在尝试模拟Objective c 如何在UITextField上模拟isEditing getter?,objective-c,uitextfield,ocmock,Objective C,Uitextfield,Ocmock,我一直在尝试模拟UITextField上的一个简单属性: @property(非原子、只读、getter=isEditing)BOOL编辑 我试着用两种方式来嘲笑这一点 1.)使用完整的类方法swizzle技术(通常对于基于类的方法,我会这样做) 2.)使用自定义ocmock帮助程序创建自定义“并返回bool”方法 不幸的是,这两种技术都失败了,我几乎可以肯定这是因为这是UITextFieldmarked readonly w/a getter上的一个正常属性(以前在iOS上从未见过) **通过
UITextField
上的一个简单属性:
@property(非原子、只读、getter=isEditing)BOOL编辑代码>
我试着用两种方式来嘲笑这一点
1.)使用完整的类方法swizzle技术(通常对于基于类的方法,我会这样做)
2.)使用自定义ocmock帮助程序创建自定义“并返回bool”方法
不幸的是,这两种技术都失败了,我几乎可以肯定这是因为这是UITextField
marked readonly w/a getter上的一个正常属性(以前在iOS上从未见过)
**通过失败,以下NSLog
始终返回(null)-这意味着我不能存根此
- (IBAction)next
{
for (int i = 0; i<[self.fieldsArray count]; i++) {
NSLog(@"is this field being edited? %@", [[self.fieldsArray objectAtIndex:i] isEditing]);
}
}
有人知道另一种方法来存根这个结果吗?如果没有,上面列出的两种方法是什么?我有没有做错什么
提前谢谢你你似乎把类方法和实例方法混淆了。运行时函数class\u getClassMethod
返回一个类方法,但由于您感兴趣的方法是属性访问器,因此它不能是类方法(类没有属性,只有实例有属性)。相反,使用class\u getInstanceMethod
获取访问器方法。使用此存根设置时
id firstField = [OCMockObject niceMockForClass:[UITextField class]];
[[[firstField stub] andReturnBool:YES] isEditing];
你对firstField还做了什么?您确定其他对象与模拟实例firstField交互,还是与XIB文件中实例化的UITextField的真实实例交互
对于无法注入mock并且必须处理在别处创建的实例的情况,OCMock提供部分mock。这些允许您在现有对象上存根方法。在您的情况下,您可以这样做:
id firstField = ... // somehow get a reference to the actual field object
id firstFieldMock = [OCMockObject partialMockForObject:firstField];
[[[firstFieldMock stub] andReturnBool:YES] isEditing];
之后,当另一个对象在firstField上调用isEditing时,mock将拦截它。放得好-但是当我将其修改为class_getInstanceMethod时,它似乎仍然没有正确地将其插入。这个只读获取者不让我存根还有其他原因吗?
id firstField = [OCMockObject niceMockForClass:[UITextField class]];
[[[firstField stub] andReturnBool:YES] isEditing];
id firstField = [OCMockObject niceMockForClass:[UITextField class]];
[[[firstField stub] andReturnBool:YES] isEditing];
id firstField = ... // somehow get a reference to the actual field object
id firstFieldMock = [OCMockObject partialMockForObject:firstField];
[[[firstFieldMock stub] andReturnBool:YES] isEditing];