XCTAssertThrows 可以捕获 c++ 异常吗?
Posted
技术标签:
【中文标题】XCTAssertThrows 可以捕获 c++ 异常吗?【英文标题】:Can XCTAssertThrows catch c++ exception? 【发布时间】:2014-04-22 08:11:03 【问题描述】:我正在使用 XCTest 对一些 c++/OC 混合代码进行单元测试。我发现 XCTAssertThrows 似乎无法捕获 c++ 异常?
我的用法很简单
比如说,像 c++ test() 这样的表达式
XCTAssertThrows(test(), "has throws")
有什么建议吗?
【问题讨论】:
【参考方案1】:简答:自己包起来
长答案:您可以为任何 std::exception 包装一个 NSException,像这样
#import <XCTest/XCTest.h>
#import <exception>
@interface NSException (ForCppException)
@end
@implementation NSException (ForCppException)
- (id)initWithCppException:(std::exception)cppException
NSString* description = [NSString stringWithUTF8String:cppException.what()];
return [self initWithName:@"cppException" reason:description userInfo:nil];
@end
@interface XCTestCase (ForCppException)
@end
@implementation XCTestCase (ForCppException)
- (void)rethowNSExceptionForCppException:(void(^)())action
try
action();
catch (const std::exception& e)
@throw [[NSException alloc] initWithCppException:e];
@end
#define XCTAssertCppThrows(expression, format...) \
XCTAssertThrows([self rethowNSExceptionForCppException:^expression;], ## format)
像这样使用它:
#pragma mark - test
void foo()
throw std::exception();
void bar()
@interface testTests : XCTestCase
@end
@implementation testTests
- (void)testExample
XCTAssertCppThrows(foo(), @"should thow exception"); // succeed
XCTAssertCppThrows(bar(), @"should thow exception"); // failed
@end
【讨论】:
以上是关于XCTAssertThrows 可以捕获 c++ 异常吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 XCTAssertThrows 模拟进行 Swift 单元测试