Не удалось найти дескриптор перечисления PBFieldDescriptorProto_Label во время модульного тестирования.

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

  •  21-12-2019
  •  | 
  •  

Вопрос

После добавления платформы GoogleCast к цели модульного теста прямо перед началом выполнения тестов я получаю следующее исключение.Кроме того, SDK полностью функционален.Буду признателен за любые идеи!

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 и об этой ошибке уже сообщалось здесь.

В ожидании исправления временным решением может быть издевательство GCKPB_PBGeneratedMessage's +initialize в ваших модульных тестах с помощью OCMock (или любой другой макетной среды), добавив следующий код в ваш тестовый класс:

#import <OCMock/OCMock.h>

@interface GCKPB_PBGeneratedMessage : NSObject
@end

и

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

Редактировать

Начиная с API отправителя iOS версии 2.3.0 953, это исправлено, и этот обходной путь больше не требуется.

Другие советы

Я наткнулся на аналогичную ошибку при выполнении тестов подразделения с использованием спектра.Я вручную проигнорировал утверждение, создав свой собственный обработчик утверждения.

Определено в классе помощника:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top