Използването на OCMock за очакване на методите за категории дава [NSProxy doesNotRecognizeSelector]"

Използвам OCMock, опитвайки се да тествам поведението на NSURLConnection. Ето непълния тест:

#include "GTMSenTestCase.h"
#import <OCMock/OCMock.h>

@interface HttpTest : GTMTestCase

- (void)testShouldConnect;

@end

@implementation HttpTest

- (void)testShouldConnect {
  id mock = [OCMockObject mockForClass:[NSURLConnection class]];

  NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
  NSURLRequest *request = [NSURLRequest requestWithURL:url];
  NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:mock startImmediately:NO];

  [[mock expect] connection:connection didReceiveResponse:OCMOCK_ANY];
}

@end

Когато се подигравам на клас с методи на категория, какъвто е методът на делегиране connection:didReceiveresponse:, получавам грешката:

Unknown.m:0:0 Unknown.m:0: error: -[HttpTest testShouldConnect] : *** -[NSProxy doesNotRecognizeSelector:connection:didReceiveResponse:] called!

Някой имал ли е проблем с това?


person Hans Sjunnesson    schedule 31.10.2009    source източник


Отговори (2)


Изглежда, че сте създали макет обект на NSURLConnection. Предупреждението NSProxy обаче е правилно, обект NSURLConnection няма селекторната връзка:didReceiveResponse: - това е селектор, който се предава на обект, който имплементира протокола.

Трябва да се подигравате на обект, който имплементира NSURLConnectionDelegate. Тъй като делегатният протокол указва връзка:didReceiveResponse: не трябва да получавате грешка :)

Нямам много опит с OCMock, но това изглежда премахва грешката при компилиране:

@interface ConnectionDelegate : NSObject { }
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
@end

@implementation ConnectionDelegate
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { }
@end



@interface ConnectionTestCase : SenTestCase { }
@end

@implementation ConnectionTestCase

- (void)testShouldConnect {
 id mock = [OCMockObject mockForClass:[ConnectionDelegate class]];

 NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:mock startImmediately:NO];

 [[mock expect] connection:connection didReceiveResponse:OCMOCK_ANY];
}

@end

Надявам се това да помогне,

Сам

person deanWombourne    schedule 05.11.2009

Попаднах на тази грешка, когато библиотека на проект се компилира с GCC опция COPY_PHASE_STRIP, зададена на YES, така че символите не се виждаха. След това тестовете се проведоха срещу тази библиотека и не можаха да видят методите, които трябваше да бъдат премахнати, настройката COPY_PHASE_STRIP=NO коригира проблема

person amleszk    schedule 13.03.2014