将 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+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 开始,此问题现已修复,不再需要此解决方法。

其他提示

使用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
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top