Skip to content

Instantly share code, notes, and snippets.

@vl4dimir
Created November 20, 2010 14:44
Show Gist options
  • Save vl4dimir/707869 to your computer and use it in GitHub Desktop.
Save vl4dimir/707869 to your computer and use it in GitHub Desktop.
Example asynchronous GHUnit test.
#import <SenTestingKit/SenTestingKit.h>
@interface AsyncTests : SenTestCase {
NSCondition* condition;
BOOL operationSucceeded;
}
@end
#import "AsyncTests.h"
@implementation AsyncTests
- (void) setUp
{
condition = [[NSCondition alloc] init];
operationSucceeded = NO;
}
- (void) tearDown
{
[condition release];
}
- (void) testAsynchronousMethodCall
{
// Create and start an asynchronous operation
NSOperationQueue* queue = [[[NSOperationQueue alloc] init] autorelease];
MyOperation* operation = [[[MyOperation alloc] init] autorelease];
[queue addOperation:operation];
// Block and wait for one of the delegate methods to be called
[condition lock];
[condition wait];
[condition unlock];
// Our operation has completed at this point, so we can check if it was successful
STAssertTrue(operationSucceeded, @"");
}
- (void) myOperationDidFinish
{
operationSucceeded = YES;
[condition lock];
[condition signal];
[condition unlock];
}
- (void) myOperationDidFailWithError:(NSError*)error
{
operationSucceeded = NO;
[condition lock];
[condition signal];
[condition unlock];
}
@end
@jmoody
Copy link

jmoody commented Apr 13, 2012

To solve the problem where neither delegate method is called, you could replace -wait with -waitUntilDate:

NSDate *date = [[NSDate date] dateByAddingTimeInterval:10];
[condition lock];
BOOL timedOut = ![self.condition waitUntilDate:date];
[self.condition unlock];

if (timedOut) {
  // do something
} else {
    GHAssertTrue(self.operationSucceeded, nil);
}

I encountered this problem when testing async code on the command line. Specifically, I was testing the outcome of an ASIHTTRequest. On the command line, my asynchronous tests were hanging so I implemented the 10 sec timeout with -waitUntilDate:. Unfortunately, I have not discovered the root of the problem: why are the async tests hanging on the command line?

@chris-hatton
Copy link

OCUnit / SenTesting framework does not run within the normal RunLoop; which NSURLConnection relies on to execute. This is why the request never starts and none of the delegate methods are ever called. I tried to make this work in OCUnit for some time (including manually 'spinning' the RunLoop) with no success. The simplest/best alternative is using another test framework which does run tests in full application mode. I recommend GHUnit for ease of use; it's quick to set up and there are plenty of examples online.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment