猕猴桃 - 期望为零,得到KWAsyncVerifier

时间:2013-06-22 12:10:54

标签: objective-c asynchronous objective-c-blocks afnetworking kiwi

我正在使用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。

有没有其他选择如何测试呢?

1 个答案:

答案 0 :(得分:2)

我的第一个建议是你不应该测试你的库。从我在您的示例中看到的内容,您基本上检查AFHTTPRequestOperation是否按照文档记录,但这不是您负责测试的。您应该测试是否正确调用了AFNetworking,并且在给定responseObject或错误的情况下,您的代码会按预期运行。

无论如何,关于你所看到的,你在同一行中有两个“应该”:shouldEventuallyshouldBeNil;他们使用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秒后失败) )。希望它有所帮助。