No se puede encontrar el descriptor de enumeración PBFieldDescriptorProto_Label mientras se realiza la testing de unidad

Después de agregar el marco GoogleCast al objective de la testing de la unidad, recibo la siguiente exception justo antes de que comiencen a ejecutarse las testings. Aparte de eso, el SDK es completamente funcional. ¡Apreciaría cualquier idea!

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 

El comportamiento de OCUnit es recorrer cada class y, por lo tanto, invocar +initialize:

Pero GCKPB_PBGeneratedMessage no lo maneja correctamente y este error ya se ha informado aquí .

Mientras espera una solución, una solución temporal podría ser GCKPB_PBGeneratedMessage el método GCKPB_PBGeneratedMessage +initialize en las testings de su unidad con OCMock (o cualquier otro marco simulado) agregando el siguiente código a su class de testing:

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

y

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

Editar

A partir de iOS sender API v2.3.0 953, esto ahora se soluciona y esta solución ya no es necesaria.

Encontré un error similar al hacer las testings de unidad con Specta. Ignore manualmente la afirmación creando mi propio manejador de aserciones.

Definido en una class auxiliar:

 #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