unit testing时无法find枚举描述符PBFieldDescriptorProto_Label

在将GoogleCast框架添加到unit testing目标之后,在testing开始运行之前,我收到以下exception。 除此之外,SDK是完整的function。 我会很感激任何想法!

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 

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

但是GCKPB_PBGeneratedMessage没有正确处理这个错误,这个错误已经在这里报告了 。

在等待修复时,临时解决scheme可能是在您的unit testing中使用OCMock(或任何其他模拟框架)模拟GCKPB_PBGeneratedMessage+initialize方法,方法是将以下代码添加到testing类中:

 #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开始,现在已经修复,并且不再需要此解决方法。

当使用Specta进行unit testing时,我遇到了类似的错误。 我通过创build自己的断言处理程序手动忽略了断言。

在辅助类中定义:

 #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