1

我正在使用 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 中的原因。

有没有其他方法可以测试这个?

4

1 回答 1

2

我的第一个建议是你不应该测试你的库。根据我在您的示例中所读到的内容,您基本上是在检查AFHTTPRequestOperation是否按文档说明工作,但这不是您进行测试的责任。您应该测试您是否正确调用了 AFNetworking,并且在给定responseObject错误或错误的情况下,您的代码会按预期运行。

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

于 2013-06-22T13:35:05.750 回答