Модульный тест с имитацией веб-службы продолжает падать

Для моего проекта я хотел сделать это немного TDD, хотя я совершенно новичок в Objective C и модульном тестировании. Я создал проект, который подключается к веб-службе, которая возвращает ответ json. Теперь я создал модульный тест, чтобы издеваться над веб-службой, и он продолжает падать (даже не терпеть неудачу), и на данный момент я полностью потерян....

У меня есть следующая установка:

SignUpService (для создания новой учетной записи), который использует ServiceHelper (который делает фактические запросы веб-службы http). Вот так ServiceHelper.h:

@protocol ServiceHelperProtocol <NSObject> 
@required
- (NSString *)get:(NSString *)url; 
@end

@interface ServiceHelper : NSObject <ServiceHelperProtocol> {
    NSMutableData *receivedData; 
}

И SignUpService.h

@class ServiceHelper;

@protocol SignUpServiceProtocol <NSObject>
- (NSString *)createUserAccount:(CreateUserAccountRequest *)createUserAccountRequest;
- (bool)doesUsernameExist:(NSString *)userName;
- (BOOL)isEmailValid:(NSString *)email;
- (BOOL)doesEmailExist:(NSString *)email;
@end

@interface SignUpService : NSObject <SignUpServiceProtocol> {
    id <ServiceHelperProtocol> serviceHelper;
}

@property(strong) id <ServiceHelperProtocol> serviceHelper;
- (id)initWithHelper:(id <ServiceHelperProtocol>)myServiceHelper;

Далее идут модульные тесты (SignUpServiceTests.h и реализация)

@interface SignUpServiceTests : SenTestCase {
    id <NSObject, ServiceHelperProtocol> serviceHelper;

    SignUpService *signUpService;
    CreateUserAccountRequest *createUserAccountRequest;
}
@property(nonatomic, strong) SignUpService *signUpService;
@property(nonatomic, strong) CreateUserAccountRequest *createUserAccountRequest;
@property(nonatomic, strong) id <NSObject, ServiceHelperProtocol> serviceHelper;

И реализация:

@implementation SignUpServiceTests

@synthesize signUpService;
@synthesize createUserAccountRequest;
@synthesize serviceHelper;

- (void)setUp {
    [super setUp];

    // Set-up code here.
    self.createUserAccountRequest = [[CreateUserAccountRequest alloc] init];
    self.createUserAccountRequest.firstName = @"first-name";
    self.createUserAccountRequest.lastName = @"last-name";
    .....

    self.serviceHelper = [ServiceHelper new];

    self.signUpService = [[SignUpService alloc] initWithHelper:(id <ServiceHelperProtocol>) self.serviceHelper];
}

- (void)tearDown {
    // Tear-down code here.
    [super tearDown];
}

- (void)testOnCreateUserAccountShouldReturnCreatedUserIdWhenCorrectResponseFromService {
    id mock = [OCMockObject partialMockForObject:(NSObject *) (id <ServiceHelperProtocol>) self.serviceHelper];
    [[[mock stub] andReturn:@"{\"status\":\"ok\",\"create_user\":\"12\"}"] get:[OCMArg any]];

    assertThat([self.signUpService createUserAccount:self.createUserAccountRequest], equalTo(@"12"));
}

Проект содержит OCMock версии 1.77 и библиотеки OCHamcrest.

По какой-то причине тест продолжает падать с сообщением «Процесс завершен с кодом выхода 0». Когда я отлаживаю, я не вижу, что происходит не так. Я чувствую, что это как-то связано с управлением памятью или с OCMock и ARC? (как предложено здесь и здесь)

Любые мысли или предложения для начинающего разработчика Objective C?


person Rutger van Dijk    schedule 13.04.2012    source источник


Ответы (1)


Не имея дополнительной информации, я подозреваю, что это не из-за проблемы с памятью, а из-за того, что загрузчик не может найти структуру OCMock при запуске octest. В OS X время компоновщика (во время сборки) использует другие средства для поиска фреймворков, чем загрузчик (во время выполнения).

Общедоступные выпуски OCMock создаются с использованием @rpath в пути к загрузчику. Это обеспечивает достаточную степень гибкости макета проекта во время выполнения, но поначалу это может сбивать с толку. Можете ли вы в качестве первого шага убедиться, что переменная среды LC_RPATH включает каталог, в котором доступен фреймворк OCMock? Обсуждение @rpath на справочной странице dyld более подробно.

Кстати, недавно вышел OCMock 2.0.

person Erik Doernenburg    schedule 15.04.2012
comment
Привет, Эрик, спасибо за комментарий. Я не совсем разбираюсь в этих настройках компилятора/среды, не могли бы вы помочь мне, где мне нужно поместить эту переменную или @rpath в Xcode? - person Rutger van Dijk; 17.04.2012