Ios OCMock:在本地声明的对象上模拟方法

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

我一直在使用OCMock创建存根和mock。不过,我正在努力模拟一个本地声明的对象方法

如果我有以下代码:

// 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!),但我觉得我的类中会充斥着没有添加任何内容的帮助器方法。这是使用依赖项注入的一个重要原因-它使您的代码更易于测试,并避免创建所有这些样板文件。