【问题标题】:OCMock doesn't work properly in iOS?OCMock 在 iOS 中无法正常工作?
【发布时间】:2015-02-15 12:10:36
【问题描述】:

我创建了以下类:

@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];

但是,如果我取消注释“模拟”初始化而不是工作行,那么整个代码将无法正常工作(obj 必须等于 @“123”)。

我想为整个班级添加功能,而不仅仅是一个对象。我的代码有什么不正确的地方?

附: mockForClass:niceMockForClass: 都不起作用。

【问题讨论】:

    标签: ios mocking stub ocmock


    【解决方案1】:

    在您的测试中,以下行在模拟上设置了一个存根:

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

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

    您可以通过添加另一个存根来完成这项工作,即sharedInstance 类方法的存根,以便返回模拟:

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

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

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      相关资源
      最近更新 更多