我正在使用 XCTestCase 进行 iOS 单元测试,并且由于异步 Web 服务处理程序上的“无法识别的选择器”而崩溃,该处理程序通过 completionHandler 块返回操纵的 NSDictionary。
崩溃不是我对断言语句(XCTAssertNoThrows)的期望,我想看到由于崩溃而导致的断言失败,但是我编写的测试方法停止执行并且没有任何测试结果(通过/失败)结束。
- (void)testMethod
{
XCTestExpectation *expectation = [self expectationWithDescription:@"Task longer than timeout"];
[serviceHandler getInfoCompletionHandler:^(NSDictionary *infoDict){
NSString *value = infoDict[@"Key"];
XCTAssert(value.length > 0, @"Value should not be empty.");
[expectation fulfill];
} failure:^(NSError *error){
NSLog(@"Error: %@",error);
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:5 handler:^(NSError *error){
if (error) {
NSLog(@"Error: %@",error);
}
}];
}
不幸的是,服务处理程序代码没有被隔离来进行适当的单元测试。由于它不是孤立的,@try...@catch 没有捕获 NSInvalidArgumentException 并且它是无用的。很可能,我想实现顶级 NSSetUncaughtExceptionHandler,但我不知道如何使来自 NSSetUncaughtExceptionHandler 的相关测试失败。