Тестирование NSURLConnection Mock объект против реализации

Я работаю над настраиваемой сетевой библиотекой и пишу для нее несколько модульных тестов. Я не уверен, как это сделать.

У меня есть RequestObject, который является подклассом NSOperation

@interface RequestOperation: NSOperation

@property (неатомный, сильный) NSURLRequest *URLRequest;
@property (неатомный, сильный, только для чтения) NSURLResponse *URLResponse;
@property (неатомный, сильный, только для чтения) NSError *connectionError;
@property (неатомный, сильный, только для чтения) NSData *responseData;

-(ID)initWithURLRequest:(NSURLRequest*) запрос;

@конец

В реализации у меня есть частная категория, которая имеет NSURLConnection.

Я хочу написать контрольный пример, чтобы проверить, существует ли URLResponse после отправки запроса

- (недействительными)testIfResponseExist
{
    NSURL *url = [[NSURL alloc] initWithString:@"https://google.com"];
    NSURLRequest  *request = [[NSURLRequest alloc] initWithURL:url];

    myRequest = [[RequestOperation alloc] initWithURLRequest:request];
    [myRequest start];

    [self WaitFor:1];

    XCTAssertNotNil(myRequest.URLResponse, @"Ответ не должен быть нулевым");
}

Является ли этот способ модульного тестирования правильным?

Теперь это отправка фактического запроса на сервер. Тем не менее, я также могу заглушить NSURLConnection и отправить фиктивный ответ. Но я не уверен, куда мне идти. Каковы плюсы и минусы фиктивного объекта?

1 ответ

Решение

Ваш тест кажется правильным для тестирования библиотеки, но я считаю, что Mocking объекты больше подходят для тестирования приложений. Вам не захочется делать насмешки для приведения тестов к вашей библиотеке, а скорее к тестам в вашем приложении, которые используют вашу библиотеку.

Я дам вам пример мощи объекта с модульным тестированием.

Я просто помог написать автоматизированную среду для сильно загруженного приложения iOS. Мы использовали OCMock а также KiF на самом деле автоматизировать обновления содержимого приложения. В нашем автоматическом тесте мы используем тот же точный код, что и приложение, для обновления содержимого. Однако мы OCMock метод, который возвращает URL-адрес содержимого и возвращает другой. Это очень похоже на swizzling, Теперь приложение будет указывать на наш тестовый URL для загрузки обновлений контента при тестировании. С 1-2 строками кода мы поменяли URL без необходимости написания специального кода.

id mock = [OCMockObject mockForClass:[MasterUpdater class]];
[[[mock stub] andReturn:[NSString stringWithFormat:@"URL",BASE_UPDATE_TEST_URL]] getMasterUpdateURL];

При этом MasterUpdater:getMasterUpdateURL возвращал пользовательский URL. Это все, что нам нужно было сделать в нашем модульном тесте, чтобы мы переключили URL для наших автоматических тестов!

Если бы мы не использовали насмешки, мы бы написали дополнительный код / ​​методы в нашем производственном коде для обработки нашего автоматизированного теста.

Другие вопросы по тегам