Метод модульного тестирования с данными NSDataWithContentsOfURL

Я занимаюсь разработкой приложения для iOS и пытаюсь сделать это с помощью тестовой разработки. Я много читал на эту тему, и одна из вещей, с которыми я столкнулся в книге, состоит в том, что тесты должны быть быстрыми, повторяемыми и надежными. Как следствие, при написании теста для сетевого кода тест должен "имитировать" сеть, чтобы он мог выполняться независимо от доступности сети.

В моем коде у меня есть метод, который извлекает изображение из Интернета с помощью URL, масштабирует его и сохраняет его в файловой системе, используя dataWithContentsOfURL из NSData:

+ (void) getImage:(NSString *)imageUrl {

    UIImage *image = [UIImage imageWithData:
        [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]];

    // Scale image
    // Save image in storage 
}

У меня вопрос: какой подход был бы хорош для тестирования этого метода, чтобы тест проходил, когда код верен, и завершался неудачей, если это не так, без учета возможных сбоев сети?

В настоящее время в моих тестах я игнорирую тот факт, что метод требует подключения, и просто ожидаю, что результат будет правильным. Тем не менее, я уже вижу, как это может стать проблемой при росте моего тестового костюма, так как для его запуска уже требуется значительное количество времени. Что еще более важно, я не хочу, чтобы мои тесты проваливались только потому, что нет хорошего сетевого соединения, так как я считаю, что это не их цель. Я ценю любые предложения.

1 ответ

Решение

Ваше намерение сделать ваши тесты быстрыми, надежными и повторяемыми - это хорошо. Устранение зависимости от сети - отличный способ помочь в достижении этих целей.

Вместо того, чтобы привязываться к методу, как сейчас, помните, что инструмент, который вы пытаетесь использовать, называется разработкой test-DRIVEN. Тесты - это не просто оболочка, чтобы убедиться, что ваш код работает так, как написано. Это способ узнать, как улучшить ваш код, сделать его более тестируемым, надежным, многократно используемым и т. Д.

Чтобы устранить сетевую зависимость, вы можете рассмотреть возможность передачи URL-адреса (имя вашего параметра уже imageURL) вместо строки. Таким образом, вы можете создать URL для локальной файловой системы, а не для расположения в сети.

Я также замечаю, что ваш метод действительно выполняет много работы. Имя, которое описывает, что он на самом деле делает, может быть loadImageFromURLAndScaleItAndSaveItToDisk:. Почему бы не разбить его на несколько меньших, более проверяемых методов? Может быть, тот, который загружает изображение из URL, тот, который масштабирует изображение, и тот, который сохраняет изображение в локальной файловой системе. Вы можете протестировать каждую отдельную часть, а затем выполнить другой модульный тест, который проверяет ваш оригинальный метод, сравнивая его результаты с результатами вызова меньших методов по порядку.

Думаю, я бы также сказал, что держать тесты быстрыми, надежными и повторяемыми - это хорошая цель, но если вы хотите сделать тест "медленнее" или "не надежнее на 1000%", это нормально. Тест, который дает вам ценность, лучше, чем не писать тест, потому что вы не считаете его достаточно хорошим тестом.

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

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