我正在使用Kiwi为我的应用程序编写测试。
我编写测试来测试我的API。我在测试异步调用的文档中以此示例为指导: https://github.com/allending/Kiwi/wiki/Asynchronous-Testing
我的测试很长,所以我对我的问题进行了简化:
describe(@"My Class Name", ^{
context(@"populate", ^{
it(@"download the content", ^{
__block NSString *testResponseObject = nil;
__block NSError *testError = nil;
MyClient *apiClient = [MyClient sharedClient];
NSMutableURLRequest *request = [apiClient requestWithMethod:@"DELETE" path:@"my/path" parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
testResponseObject = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
testError = error;
}];
[apiClient enqueueHTTPRequestOperation:operation];
[[expectFutureValue(testResponseObject) shouldEventuallyBeforeTimingOutAfter(100)] equal:@"Expected Content"];
[[expectFutureValue(testError) shouldEventuallyBeforeTimingOutAfter(100)] shouldBeNil];
});
});
});
问题在于,如果一切按预期工作,并且操作成功,故障块永远不会被调用&对于NSError而不是nil,我得到了KWAsyncVerifier。
我猜这是因为Kiwi等待执行testError的块,这个块永远不会发生&这就是为什么我让KWAsyncVerifier陷入testError而不是nil。
有没有其他选择如何测试呢?
答案 0 :(得分:2)
我的第一个建议是你不应该测试你的库。从我在您的示例中看到的内容,您基本上检查AFHTTPRequestOperation
是否按照文档记录,但这不是您负责测试的。您应该测试是否正确调用了AFNetworking,并且在给定responseObject
或错误的情况下,您的代码会按预期运行。
无论如何,关于你所看到的,你在同一行中有两个“应该”:shouldEventually
和shouldBeNil
;他们使用beNil
匹配器,这在2.1中是不可用的,我认为他们正在带回来。您可以在https://github.com/allending/Kiwi/issues/293
也许你可以尝试以下方法来确保不采取故障分支:
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
testResponseObject = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// This will fail if we ever reach this branch
[error shouldBeNil];
}];
[apiClient enqueueHTTPRequestOperation:operation];
[[expectFutureValue(testResponseObject) shouldEventuallyBeforeTimingOutAfter(100)] equal:@"Expected Content"];
shouldEventuallyBeforeTimingOutAfter
将保持测试用例“活着”等待检查响应,但是如果你经历了失败分支,则另一个期望将失败(并且响应中的那个将在100秒后失败) )。希望它有所帮助。