我一直在使用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
的调用存根,因为它与文件系统交互并只返回一个字符串。我该怎么做?
答案 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)以返回本地创建的对象的存根实现