Não consegue encontrar o enum descritor PBFieldDescriptorProto_Label enquanto os testes de unidade

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

  •  21-12-2019
  •  | 
  •  

Pergunta

Depois de adicionar o GoogleCast quadro para o teste de unidade de destino que eu estou recebendo a seguinte exceção para a direita antes de os testes de começar a correr.Para além de que o SDK é totalmente funcional.Eu apreciaria qualquer ideias!

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
Foi útil?

Solução

OCUnit comportamento é ir através de cada classe e, portanto, chamada de +initialize:

Mas este não é tratado corretamente pelo GCKPB_PBGeneratedMessage e esse bug já foi relatado aqui.

Enquanto espera por uma correção, uma solução temporária pode ser a zombar GCKPB_PBGeneratedMessage's +initialize método em seus testes de unidade com OCMock (ou qualquer outro zombando framework), adicionando o seguinte código para a classe de teste:

#import <OCMock/OCMock.h>

@interface GCKPB_PBGeneratedMessage : NSObject
@end

e

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

Editar

Como de iOS remetente API v2.3.0 953, este agora é fixo, e essa solução alternativa não é mais necessário.

Outras dicas

Me deparei com um erro semelhante ao fazer Testes de Unidade usando Specta.Eu manualmente ignorado a declaração criando a minha própria afirmação do manipulador.

Definido em uma classe 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top