OCMock在iOS中无法正常运行?

时间:2015-02-15 12:10:37

标签: ios mocking stub ocmock

我创建了以下类:

@implementation BCGlobalConstantBox

+ (instancetype)sharedInstance {

    static BCGlobalConstantBox *instance = nil;
    static dispatch_once_t predicate;
    dispatch_once( &predicate, ^{

        instance = [[self alloc] init];
    });
    return instance;
}

- (NSString *)someMethod {

    return nil;
}

@end

然后我通过源添加了OCMock(只是将文件添加到我的项目中)。我不是将它用于测试,而是用作通常调试目标中的临时数据。

以下代码有效:

    id goalObj = [BCGlobalConstantBox class];
    id mock = [OCMockObject niceMockForClass:goalObj];
//    id mock = [OCMockObject partialMockForObject:[goalObj sharedInstance]];
    NSArray *arr = @[@1, @2, @3];
    [[[mock stub] andReturn:@"123"] someMethod];
    id obj = [[BCGlobalConstantBox sharedInstance] someMethod];

但如果我用" mock"取消注释该行。初始化而不是工作,然后整个代码不能正常工作(obj必须相等@" 123")。

我想为整个类添加功能,而不是仅添加一个对象。我的代码中有什么不对?

P.S。 mockForClass:niceMockForClass:都无法正常工作。

1 个答案:

答案 0 :(得分:2)

在测试中,以下行在模拟上设置存根:

[[[mock stub] andReturn:@"123"] someMethod];

但是,在someMethod上的sharedInstance类方法返回的对象上调用BCGGlobalConstantBox以下,并返回实例,而不是模拟。这意味着模拟上的存根无法正常工作。

您可以通过添加另一个存根,sharedInstance类方法的存根来执行此操作,以便返回模拟:

[[[mock stub] andReturn:mock] sharedInstance];

如果在共享实例上调用了许多其他方法,替代方法将在测试中检索共享实例,然后为其创建部分模拟,并使用该部分模拟残余部分。