Это похоже на ответ Джона, хотя и не помещается в комментарии.Первый шаг - убедиться, что вы не создаете реальное соединение.Самый простой способ добиться этого - перетащить создание соединения в фабричный метод, а затем заменить фабричный метод в своем тесте.С частичной поддержкой OCMock это может выглядеть следующим образом.
В вашем реальном классе:
- (NSURLConnection *)newAsynchronousRequest:(NSURLRequest *)request
{
return [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
В вашем тесте:
id objectUnderTest = /* create your object */
id partialMock = [OCMockObject partialMockForObject:objectUnderTest];
NSURLConnection *dummyUrlConnection = [[NSURLConnection alloc]
initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"file:foo"]]
delegate:nil startImmediately:NO];
[[[partialMock stub] andReturn:dummyUrlConnection] newAsynchronousRequest:[OCMArg any]];
Теперь, когда тестируемый объект пытается создать URL-соединение, он фактически получаетфиктивное соединение создано в тесте.Фиктивное соединение не обязательно должно быть действительным, потому что мы его не запускаем и оно никогда не используется.Если ваш код использует соединение, вы можете вернуть другой макет, тот, который имитирует NSURLConnection.
Второй шаг - вызвать метод для вашего объекта, который инициирует создание NSURLConnection:
[objectUnderTest doRequest];
Поскольку тестируемый объект не использует реальное соединение, теперь мы можем вызывать методы делегата из теста.Для NSURLResponse мы используем другой макет, данные ответа создаются из строки, определенной в другом месте теста:
int statusCode = 200;
id responseMock = [OCMockObject mockForClass:[NSHTTPURLResponse class]];
[[[responseMock stub] andReturnValue:OCMOCK_VALUE(statusCode)] statusCode];
[objectUnderTest connection:dummyUrlConnection didReceiveResponse:responseMock];
NSData *responseData = [RESPONSE_TEXT dataUsingEncoding:NSASCIIStringEncoding];
[objectUnderTest connection:dummyUrlConnection didReceiveData:responseData];
[objectUnderTest connectionDidFinishLoading:dummyUrlConnection];
Вот и все.Вы фактически фальсифицировали все взаимодействия, которые тестируемый объект имеет с соединением, и теперь вы можете проверить, находится ли он в том состоянии, в котором он должен быть.
Если вы хотите увидеть некоторый «настоящий» код,взгляните на тесты для класса из проекта CCMenu, который использует NSURLConnections.Это немного сбивает с толку, потому что тестируемый класс тоже называется соединением.
http://ccmenu.svn.sourceforge.net/viewvc/ccmenu/trunk/CCMenuTests/Classes/CCMConnectionTest.m?revision=129&view=markup