2014-02-25 96 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