Ответ (на который вы указывали) здесь должен работать и для вас.
Так что вы должны реализовать GHAsyncTestCase, как упоминал Трэвис ранее.Имея базовый класс Async, вы можете использовать waitForStatus:timeout:
и соответствующие notify:forSelector:
методы.Все утверждения должны быть сделаны после waitForStatus:timeout:
.Этот метод приостанавливает цикл выполнения и ожидает завершения обратного вызова.
Посмотрите выборки GHUnit , если вам нужна дополнительная информация об асинхронных тестах.
Так что в вашем случае я бы попробовал что-то вроде этого:
- (void)testLoadMyProfile {
//Local variable for later assertion. __block is necessary to use the variable in the block.
__block NSDictionary *d = nil;
//Preparing.
[self prepare];
void(^successCallback)(NSString*);
successCallback = ^(NSString* response) {
NSRange textRange;
textRange =[[response lowercaseString] rangeOfString:[@"syntactically incorrect" lowercaseString]];
if(textRange.location != NSNotFound) {
GHFail(@"the request was syntactically incorrect");
}
// Declared before.
// NSDictionary *d;
@try {
d = [response JSONValue];
} @catch (NSException *exception) {
// We'll check that later.
// GHAssertNotNil(d, @"The response was not a valid JSONValue");
}
// Later.
//GHAssertNotNil([d objectForKey:@"memberId"], @"memberId wasn't in response");
//GHAssertNotNil([d objectForKey:@"profile"], @"profile wasn't in response");
//GHAssertNotNil([d objectForKey:@"name"], @"profile wasn't in response");
//GHAssertNotNil([d objectForKey:@"surnamez"], @"profile wasn't in response");
// we notify ourself that we are done. selector should point to this method!
[self notify:kGHUnitWaitStatusSuccess forSelector:@selector(testLoadMyProfile)];
};
void(^errorCallback)(NSString*);
errorCallback = ^(NSString* response) {
GHFail(@"the error callback was called");
// in this case we do notify ourself that the request failed.
[self notify:kGHUnitWaitStatusFailure forSelector:@selector(testLoadMyProfile)];
};
[[RestAPIConnector sharedInstance] loadMyProfile:successCallback :errorCallback];
// This line pauses the runloop for the length of the timeout
[self waitForStatus:kGHUnitWaitStatusSuccess timeout:10.0];
// And finally after this line you can do your assertions. As the code pauses until you notify it or the timeout fires.
GHAssertNotNil(d, @"The response was not a valid JSONValue");
GHAssertNotNil([d objectForKey:@"memberId"], @"memberId wasn't in response");
GHAssertNotNil([d objectForKey:@"profile"], @"profile wasn't in response");
GHAssertNotNil([d objectForKey:@"name"], @"profile wasn't in response");
GHAssertNotNil([d objectForKey:@"surnamez"], @"profile wasn't in response");
}
Таким образом, все утверждения для асинхронных тестов необходимо выполнять после waitForStatus:timeout:
.и не забудьте notify:forSelector
.