2009-12-07 80 views
1

我有类似如何在XCode中异步返回结果的单元测试函数?

- (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 
} 

回答

1
  1. 让你的对象调用,将其从一个模拟getData:方法并检查它是否正确呼叫。

  2. 从另一个测试中调用handleDelegateMethod:方法,使用一些已准备好的数据,并确保它对给定的数据执行任何操作。

+0

Chuck正确 - 调用是异步无关紧要 - 这是其他一些依赖的行为。对你来说测试的重要之处在于调用getData:调用它的依赖关系,而handleDelegateMethod:处理所有你可以预测的各种条件。 – 2010-07-10 05:27:31

1

如果模拟数据不能发送回您的委托作为查克说,你可以做到以下几点:

  1. 使测试的委托,使其 接收回调。

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

  3. 进行调用getData

  4. 去各地主要runloop,为 如下:

    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。

相关问题