如何在XCode中异步测试返回结果的函数?

时间:2009-12-07 22:09:20

标签: iphone objective-c unit-testing

我有类似

的东西
- (void)getData:(SomeParameter*)param
{
   // Remotely call out for data returned asynchronously
   // returns data via a delegate method
}


- (void)handleDataDelegateMethod:(NSData*)data
{
   // Handle returned data
}

我想为此编写一个单元测试,我怎样才能做比

更好的事情
NSData* returnedData = nil;

- (void)handleDataDelegateMethod:(NSData*)data
{
   returnedData = data;
}

- (void)test
{
   [obj getData:param];
   while (!returnedData)
   {
      [NSThread sleep:1];
   }
   // Make tests on returnedData
}

2 个答案:

答案 0 :(得分:1)

  1. 让您的对象通过getData:方法调用模拟并检查它是否正确调出。

  2. 使用一些现成的数据从另一个测试中调用handleDelegateMethod:方法,并确保它对所提供的数据执行任何操作。

答案 1 :(得分:1)

如果无法将模拟数据发送回您的代表,Chuck说您可以执行以下操作:

  1. 让您的考试成为代表 收到回调。

  2. 将字段添加到测试类callBackInvoked和errorHasOccurred。将它们都设置为NO。

  3. 拨打getData

  4. 绕过主要的runloop,as 如下:

     NSDate *twoSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:2.0];
     while (!callBackInvoked && !errorHasOccured && runCount-- &&  [[NSRunLoop currentRunLoop]  runMode:NSDefaultRunLoopMode beforeDate:twoSecondsFromNow]) {
       twoSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:2.0];
      }
    

    (您可以将runCount设置为您认为合理等待的次数)。

  5. 在测试类的handleDataDelegateMethod中,将callBackInvoked设置为YES。同样,如果您有错误回调,则可以将errorHasOccured设置为YES。

  6. 您的测试应断言callBackInvoked为YES且erroHasOccurred为NO。