Impossibile trovare il descrittore enum PBFieldDescriptorProto_Label durante il test dell'unità

StackOverflow https://stackoverflow.com//questions/22022511

  •  21-12-2019
  •  | 
  •  

Domanda

Dopo aver aggiunto il framework GoogleCast alla destinazione del test unitario, ricevo la seguente eccezione subito prima dell'inizio dell'esecuzione dei test.A parte questo, l'SDK è completamente funzionante.Apprezzerei qualsiasi 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
È stato utile?

Soluzione

Il comportamento di OCUnit è quello di passare attraverso ogni classe e quindi chiamare +initialize:

Ma questo non viene gestito correttamente da GCKPB_PBGeneratedMessage e questo bug è già stato segnalato Qui.

In attesa di una soluzione, una soluzione temporanea potrebbe essere quella di deridere GCKPB_PBGeneratedMessage'S +initialize nei tuoi unit test con OCMock (o qualsiasi altro framework mocking) aggiungendo il seguente codice alla tua classe di test:

#import <OCMock/OCMock.h>

@interface GCKPB_PBGeneratedMessage : NSObject
@end

E

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

Modificare

A partire dall'API mittente iOS v2.3.0 953, questo problema è stato risolto e questa soluzione alternativa non è più necessaria.

Altri suggerimenti

Mi sono imbattuto in un errore simile quando si eseguono test dell'unità usando Specta.Ho ignorato manualmente l'affermazione creando il mio gestore di asserzione.

Definito in una classe helper:

#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];                                                                             \
.

xxxloguassertionandler.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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top