How to unit test asynchronous APIs?

后端 未结 13 958
孤城傲影
孤城傲影 2020-11-30 17:34

I have installed Google Toolbox for Mac into Xcode and followed the instructions to set up unit testing found here.

It all works great, and I can test my synchronous

13条回答
  •  失恋的感觉
    2020-11-30 18:02

    I ran into the same question and found a different solution that works for me.

    I use the "old school" approach for turning async operations into a sync flow by using a semaphore as follows:

    // create the object that will perform an async operation
    MyConnection *conn = [MyConnection new];
    STAssertNotNil (conn, @"MyConnection init failed");
    
    // create the semaphore and lock it once before we start
    // the async operation
    NSConditionLock *tl = [NSConditionLock new];
    self.theLock = tl;
    [tl release];    
    
    // start the async operation
    self.testState = 0;
    [conn doItAsyncWithDelegate:self];
    
    // now lock the semaphore - which will block this thread until
    // [self.theLock unlockWithCondition:1] gets invoked
    [self.theLock lockWhenCondition:1];
    
    // make sure the async callback did in fact happen by
    // checking whether it modified a variable
    STAssertTrue (self.testState != 0, @"delegate did not get called");
    
    // we're done
    [self.theLock release]; self.theLock = nil;
    [conn release];
    

    Make sure to invoke

    [self.theLock unlockWithCondition:1];
    

    In the delegate(s) then.

提交回复
热议问题