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

时间:2014-04-14 19:23:07

标签: ios objective-c unit-testing mocking ocmock

我一直在使用OCMock来创建存根和模拟。我虽然努力模拟一个本地声明的对象方法。

如果我有以下代码:

// 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 个答案:

答案 0 :(得分:1)

不能按原样使用您的代码。您可以做两件事来测试这种情况 - 使用依赖注入或工厂方法。

选项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)以返回本地创建的对象的存根实现

相关问题