Unable to find enum descriptor PBFieldDescriptorProto_Label while unit testing

匿名 (未验证) 提交于 2019-12-03 08:57:35

问题:

After adding the GoogleCast framework to the unit test target I'm getting the following exception right before the tests start to run. Apart from that the SDK is fully functional. I'd appreciate any ideas!

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 

回答1:

OCUnit's behaviour is to go through each class and hence call +initialize:

But this is not handled properly by GCKPB_PBGeneratedMessage and this bug has already been reported here.

While waiting for a fix, a temporary solution might be to mock GCKPB_PBGeneratedMessage's +initialize method in your unit tests with OCMock (or any other mocking framework) by adding the following code to your test class:

#import <OCMock/OCMock.h>  @interface GCKPB_PBGeneratedMessage : NSObject @end 

and

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

Edit

As of iOS sender API v2.3.0 953, this is now fixed and this workaround is no longer required.



回答2:

I came across a similar error when doing Unit Tests using Specta. I manually ignored the assert by creating my own assertion handler.

Defined in a helper class:

#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 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!