Ios OCMock:在本地声明的对象上模拟方法
我一直在使用OCMock创建存根和mock。不过,我正在努力模拟一个本地声明的对象方法 如果我有以下代码:Ios OCMock:在本地声明的对象上模拟方法,ios,objective-c,unit-testing,mocking,ocmock,Ios,Objective C,Unit Testing,Mocking,Ocmock,我一直在使用OCMock创建存根和mock。不过,我正在努力模拟一个本地声明的对象方法 如果我有以下代码: // Example.m #import "Object.h" - (NSString *) methodWithLocallyDeclaredObject{ Object *obj = [[Object alloc] init]; NSString *string1 = [obj methodOnObject]; NSString *string2 = [N
// Example.m
#import "Object.h"
- (NSString *) methodWithLocallyDeclaredObject{
Object *obj = [[Object alloc] init];
NSString *string1 = [obj methodOnObject];
NSString *string2 = [NSString stringWithFormat:@"prepend %@", string1];
return string2;
}
我希望能够在
methodOnObject
与文件系统交互时取消对它的调用,只返回一个字符串。我该怎么做 不可能按原样处理代码。为了能够测试这个案例,您可以做两件事——使用依赖项注入或工厂方法
选项1-依赖项注入:
将方法签名更改为需要对象而不是创建对象:
-(NSString *) methodWithObject:(Object*)obj
{
}
此方法优于选项2,但并不完全适合您提出的问题
选项2-工厂方法:
不要内联创建对象,而是使用帮助器方法将其返回给您:
- (NSString *) methodWithLocallyDeclaredObject{
Object *obj = [self newObject];
NSString *string1 = [obj methodOnObject];
NSString *string2 = [NSString stringWithFormat:@"prepend %@", string1];
return string2;
}
-(Object*)newObject
{
return [[Object alloc] init];
}
然后,您可以使用部分模拟来模拟newObject
方法并返回不同的内容
id partiallyMockedObject = [OCMockObject partialMockForObject:objectToTest];
[[[partiallyMockedObject expect] andReturn:yourMock] newObject];
因此,您正在部分模拟要测试的对象(objectToTest)以返回本地创建对象的存根实现实际上,您可以在
对象
上存根+alloc
类方法,并使其返回模拟,然后可以在其上存根methodOnObject
。我没有把它作为一个答案,因为我认为这个答案中的两个选项更可取。啊,好吧,有点恼人,它不能直接完成。我觉得我会经常遇到这种情况。你为什么说删除alloc类方法是不可取的?选项二是明智的,而且非常简单(感谢@michaels!),但我觉得我的类中会充斥着没有添加任何内容的帮助器方法。这是使用依赖项注入的一个重要原因-它使您的代码更易于测试,并避免创建所有这些样板文件。