Всегда сложно тестировать методы, которые вызывают методы класса, такие как NSURLConnection sendSynchronousRequest
Вот несколько вариантов:
a) Используйте макрос invokeSuperfter Мэтта Галлахера для перехвата вызова. Ваш юнит-тест будет содержать такой код:
@implementation NSURLConneciton (UnitTests)
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error {
if (someFlagYourTestUsesToInterceptTheCall) {
// return test NSData instance
}
return invokeSupersequent(request, &response, &error);
}
@end
Затем вы устанавливаете someFlagYourTestUsesToInterceptTheCall
, чтобы заставить его перехватывать вызов и возвращать ваши тестовые данные.
b) Другая альтернатива - переместить этот вызов в собственный метод в тестируемом классе:
-(NSData *)retrieveNewsCount:(NSURLRequest *)request {
NSHTTPURLResponse *response;
NSError *error;
return [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
}
Затем перехватите этот вызов в вашем тестовом примере, используя OCMock:
-(void)testNewsCount {
// instantiate your class
id myObject = ...;
id mock = [OCMockObject partialMockForObject:myObject];
[[[mock stub] andCall:@selector(mockNewsCount:) onObject:self] retrieveNewsCount:[OCMArg any]];
NSUInteger count = [myObject newsCount];
// validate response
...
}
// in the same test class:
-(NSData *)mockNewsCount:(NSURLRequest *)request {
// return your mock data
return mockData;
}
В этом случае OCMock stub:andCall:onObject:someMethod
перехватывает только этот вызов метода вашего объекта, чтобы ввести некоторые тестовые данные во время теста.