2014-02-25 66 views
3

在将GoogleCast框架添加到单元测试目标后,我在测试开始运行之前收到以下异常。除此之外,SDK功能完整。我会很感激任何想法!单元测试时无法找到枚举描述符PBFieldDescriptorProto_Label

2014-02-25 18:03:08.475 otest[3786:303] Unknown Device Type. Using UIUserInterfaceIdiomPhone based on screen size 
2014-02-25 18:03:08.593 otest[3786:303] *** Assertion failure in -[GCKPB_PBFieldDescriptor initWithFieldDescription:rootClass:], /Volumes/BuildData/pulse-data/agents/wpye22.hot/recipes/415961027/base/googlemac/iPhone/Chromecast/SDKv2/Protos/../../../../ThirdParty/ProtocolBuffers/objectivec/Classes/PBDescriptor.m:409 
2014-02-25 18:03:08.596 otest[3786:303] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to find enum descriptor PBFieldDescriptorProto_Label' 
*** First throw call stack: 
(
    0 CoreFoundation      0x00b1d5e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x007958b6 objc_exception_throw + 44 
    2 CoreFoundation      0x00b1d448 +[NSException raise:format:arguments:] + 136 
    3 Foundation       0x00010fee -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116 
    4 UnitTests       0x077205dd -[GCKPB_PBFieldDescriptor initWithFieldDescription:rootClass:] + 1640 
    5 UnitTests       0x0771f52c +[GCKPB_PBDescriptor allocDescriptorForClass:rootClass:fields:fieldCount:enums:enumCount:ranges:rangeCount:storageSize:wireFormat:] + 173 
    6 UnitTests       0x076e550f +[GCKPB_PBFieldDescriptorProto descriptor] + 179 
    7 UnitTests       0x077226b2 +[GCKPB_PBGeneratedMessage initialize] + 100 
    8 libobjc.A.dylib      0x00796275 _class_initialize + 599 
    9 libobjc.A.dylib      0x0079d0f1 lookUpImpOrForward + 158 
    10 libobjc.A.dylib      0x0079d04e _class_lookupMethodAndLoadCache3 + 55 
    11 libobjc.A.dylib      0x007a512f objc_msgSend + 139 
    12 SenTestingKit      0x201086c6 +[NSObject(SenTestRuntimeUtilities) senIsASuperclassOfClass:] + 74 
    13 SenTestingKit      0x2010879e +[NSObject(SenTestRuntimeUtilities) senAllSubclasses] + 154 
    14 SenTestingKit      0x20106fa0 +[SenTestSuite updateCache] + 42 
    15 SenTestingKit      0x201071cf +[SenTestSuite suiteForBundleCache] + 93 
    16 SenTestingKit      0x20107241 +[SenTestSuite testSuiteForBundlePath:] + 101 
    17 SenTestingKit      0x201061fb +[SenTestProbe specifiedTestSuite] + 294 
    18 SenTestingKit      0x20106467 +[SenTestProbe runTests:] + 177 
    19 libobjc.A.dylib      0x007a7737 +[NSObject performSelector:withObject:] + 70 
    20 otest        0x00002372 otest + 4978 
    21 otest        0x000025c4 otest + 5572 
    22 otest        0x000026a5 otest + 5797 
    23 otest        0x00002031 otest + 4145 
    24 libdyld.dylib      0x0165570d start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

回答

2

的OCUnit的行为是要经过每一个类,因此调用+initialize:

但这不是由GCKPB_PBGeneratedMessage妥善处理和这个bug已经被报道here

在等待一个解决方法,临时的解决方案可能是通过将下面的代码来测试类嘲笑GCKPB_PBGeneratedMessage+initialize方法在单元测试中与OCMock(或任何其它模拟框架):

#import <OCMock/OCMock.h> 

@interface GCKPB_PBGeneratedMessage : NSObject 
@end 

+ (void)initialize 
{ 
    id mockCastGeneratedMessage = [OCMockObject mockForClass:[GCKPB_PBGeneratedMessage class]]; 
    [[mockCastGeneratedMessage stub] initialize]; 
} 

编辑

作为iOS的发送方API v2.3.0 953,现在已经修复,并且不再需要此解决方法。

+1

哇,伟大的东西!谢谢。 –

+0

这可能是最好的一个新问题,但想到我会先问这里:有没有人有机会想到Kiwi?我试图用KWMock做类似的嘲弄,但它不起作用。 – chaingarden

0

我在使用Specta进行单元测试时遇到了类似的错误。我通过创建自己的断言处理程序来手动忽略断言。

定义在一个辅助类:

#define SPT_fail(...) \ 
    SPTSpec *spec = [[SPTCurrentTestCase class] spt_spec];                   \ 
    NSString *message = [NSString stringWithFormat:__VA_ARGS__];                \ 
    [SPTCurrentTestCase recordFailureWithDescription:message inFile:spec.fileName atLine:(int)spec.lineNumber expected:YES];                    \ 

xxxLoggingAssertionHandler.m:

@implementation xxxLoggingAssertionHandler 

+ (void)load { 
    [xxxLoggingAssertionHandler addHandler]; 
} 

- (void)handleFailureInMethod:(SEL)selector 
         object:(id)object 
         file:(NSString *)fileName 
        lineNumber:(NSInteger)line 
        description:(NSString *)format, ... { 

    // ignore chromecast asserts only 
    NSString *selectorName = NSStringFromSelector(selector); 
    BOOL ignore = [selectorName isEqualToString:@"initWithFieldDescription:rootClass:"] || [selectorName isEqualToString:@"allocDescriptorForClass:rootClass:fields:fieldCount:enums:enumCount:ranges:rangeCount:storageSize:wireFormat:"]; 

    if (!ignore) { 
     SPT_fail(@"NSAssert Failure: Method %@ for object %@ in %@#%i", selectorName, object, fileName, line); 
    } 
} 

- (void)handleFailureInFunction:(NSString *)functionName 
          file:(NSString *)fileName 
        lineNumber:(NSInteger)line 
        description:(NSString *)format, ... { 
    SPT_fail(@"NSCAssert Failure: Function (%@) in %@#%i", functionName, fileName, line); 
} 

+ (void)addHandler { 
    NSAssertionHandler *assertionHandler = [[xxxLoggingAssertionHandler alloc] init]; 
    [[[NSThread currentThread] threadDictionary] setValue:assertionHandler 
                forKey:NSAssertionHandlerKey]; 
} 

+ (void)removeHandler { 
    [[[NSThread currentThread] threadDictionary] setValue:nil 
                forKey:NSAssertionHandlerKey]; 
} 

@end