Использование OCMock для ожидания методов категории приводит к «[NSProxy doesNotRecognizeSelector" ...] " - PullRequest
2 голосов
/ 31 октября 2009

Я использую 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!

У кого-нибудь была проблема с этим?

Ответы [ 2 ]

4 голосов
/ 05 ноября 2009

Похоже, вы создали фиктивный объект 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

Надеюсь, это поможет,

Sam

0 голосов
/ 13 марта 2014

Я столкнулся с этой ошибкой, когда библиотека проекта компилировалась с параметром GCC COPY_PHASE_STRIP, установленным на YES, поэтому символы не были видны. Затем тесты запускались с этой библиотекой и не могли увидеть методы, которые нужно было указать. COPY_PHASE_STRIP=NO исправил проблему

...