我创建了以下类:
@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:
都无法正常工作。
答案 0 :(得分:2)
在测试中,以下行在模拟上设置存根:
[[[mock stub] andReturn:@"123"] someMethod];
但是,在someMethod
上的sharedInstance
类方法返回的对象上调用BCGGlobalConstantBox
以下,并返回实例,而不是模拟。这意味着模拟上的存根无法正常工作。
您可以通过添加另一个存根,sharedInstance
类方法的存根来执行此操作,以便返回模拟:
[[[mock stub] andReturn:mock] sharedInstance];
如果在共享实例上调用了许多其他方法,替代方法将在测试中检索共享实例,然后为其创建部分模拟,并使用该部分模拟残余部分。