SenTestingKitAsync 是 Xcode 内置单元测试框架的扩展,它实现了真正的异步测试。与其他异步测试的模式(或框架)相比,这些模式通常只是主线程上的循环等待,而这个扩展打破了测试套件的同步调用栈。有了这个扩展,对基于代理的 API 或其他异步方法的测试就变得简单了。
除了使用 SenTestingKit
进行普通的单元测试外,只需执行以下 4 个步骤
将扩展链接到您的测试目标(最好使用 CocoaPods)
target :test, :exclusive => true do pod 'SenTestingKitAsync', '~> 1.0' end
如果您想要手动操作,只需将 SenTestingKitAsync.h
和 SenTestingKitAsync.m
包含到您的测试目标中即可。
导入头文件
#import <SenTestingKitAsync/SenTestingKitAsync.h>
让测试方法以 Async
结尾
- (void)testSelectorAsync { [self performSelector:@selector(mySelector) withObject:nil afterDelay:2.0]; }
告诉测试运行器测试成功
- (void)mySelector { STSuccess(); }
这是必要的,因为测试运行器会等待直到测试明确失败(通过调用类似于 STFail(…)
或 STAssertEqualObjects(…)
的宏)或者成功(通过调用 STSuccess()
)。如果没有这些发生,测试运行器将无限期等待。
所有其他测试都与其他常规工具一样完成。例如,您可以检查代理调用参数
- (void)testSelectorAsync { [self performSelector:@selector(myOtherSelector:) withObject:@(2) afterDelay:2.0]; } - (void)myOtherSelector:(NSNumber *)value { STAssertEqualObjects(value, @(3), @"Expecting the number '3'."); STSuccess(); }
最后,因为我们只是对内置测试框架进行扩展,所以我们从错误日志中受益。如果测试未成功,它将与其他同步测试一样突出显示。
除了现有的像 STAssertTrue(…)
或 STAssertEqualObjects(…)
这样的宏之外,该扩展还引入了两个额外的宏
STFailAfter(timeout, description, …)
:这个宏开始一个计时器,如果测试没有任何其他(STAssert…
或 STSuccess
)被调用,将使用给定的描述让测试失败。STSuccess()
:必须调用此宏来指示测试成功。如果您不调用它且没有其他失败发生,则测试将无限期进行。如果您测试所需设置也支持异步处理,您现在可以使用扩展功能 SenTestCase 来实现这一点。只需在您的测试用例中实现 -[SenTest setUpWithCompletionHandler:]
或 -[SenTest tearDownWithCompletionHandler:]
,并执行设置(或拆卸)。完成后,调用完成处理程序(并且别忘了调用父类的设置或拆卸)。
- (void)setUpWithCompletionHandler:(void(^)())handler
{
[super setUpWithCompletionHandler:^{
// Your set up
handler();
}];
}
- (void)tearDownWithCompletionHandler:(void (^)())handler
{
[super tearDownWithCompletionHandler:^{
// Your tear down
handler();
}];
}
因为没有超时或错误捕获,您必须确保用于设置和拆卸的实现经过良好测试。出现错误时,请通过断言退出测试。
版权(c)2012,2013 nxtbgthng GmbH。保留所有权利。
在以下条件满足的情况下,允许以源代码形式或二进制形式进行分发和使用,是否修改
本软件由版权所有者及贡献者按“原样”提供,并明确或隐含地放弃包括但不限于适销性和特定目的适用性的任何形式的保证。在任何情况下,版权所有者或贡献者不对任何直接、间接、附带、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论因何种原因造成,无论是在合同、严格责任还是侵权行为(包括过失或不计过失)中,只要使用本软件,即使已告知此类损害的可能性。