Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在XCode中对异步返回结果的函数进行单元测试?_Iphone_Objective C_Unit Testing - Fatal编程技术网

Iphone 如何在XCode中对异步返回结果的函数进行单元测试?

Iphone 如何在XCode中对异步返回结果的函数进行单元测试?,iphone,objective-c,unit-testing,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 } 我想为此编写一个单元测试,我怎样才能做得比 NS

我有点像

- (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
}
  • 让您的对象从
    getData:
    方法调用模拟,并检查它是否正确调用

  • 使用一些现成的数据从另一个测试调用
    handleDelegateMethod:
    方法,并确保它对给定的数据执行任何应该执行的操作


  • 如果您不能像Chuck所说的那样将模拟数据发送回您的代理,您可以执行以下操作:

  • 将您的测试设置为委托,以便 接收回调

  • 将字段添加到测试类callBackInvoked和ErrorHasOccessed中。将它们都设置为NO

  • 调用
    getData

  • 围绕主运行循环,如图所示 如下:

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

  • 在测试类的handleDataDelegateMethod中,将CallbackCallcalled设置为YES。同样,如果有错误回调,可以将ErrorHasOccursed设置为YES

  • 然后,您的测试应该断言callBackInvoked为YES,errohasecursed为NO

  • Chuck说得对——调用是否异步并不重要——这是其他依赖项的行为。对您来说,需要测试的重要内容是,对getData:的调用调用调用了它的依赖项,而HandleDeleteGateMethod:处理您可以预测的所有各种条件。
     NSDate *twoSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:2.0];
     while (!callBackInvoked && !errorHasOccured && runCount-- &&  [[NSRunLoop currentRunLoop]  runMode:NSDefaultRunLoopMode beforeDate:twoSecondsFromNow]) {
       twoSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:2.0];
      }