Я хочу протестировать фрагмент кода, который использует сеть (точнее, класс NSURLConnection
). Код (назовем его NetworkManager
) выглядит примерно так:
- (id) buildConnection
{
// some more code and then:
return [NSURLConnection …];
}
- (void) startNetworkSync
{
id connection = [self buildConnection];
//…
}
В модульном тесте я бы хотел избавиться от сети, т.е. замените объект NSURLConnection
на макет. Как мне это сделать?
Я попытался создать частичный макет NetworkManager
, который заменит метод buildConnection
заглушкой. Проблема заключается в том, что частичные имитации, выполняемые OCMock только окурками из внешнего мира - отправка buildConnection
из startNetworkSync
вызывает оригинальный метод, а не заглушку.
Я также пытался «обезьянить» патч NetworkManager
класса через категорию. Это работает, я могу легко переопределить метод buildConnection
другим кодом и заменить реальный NSURLConnection
заглушкой. Проблема в том, что я не нашел простого способа, которым я мог бы получить соединение с заглушкой в тесте - соединение является частной частью NetworkManager
.
Тогда я мог бы создать подкласс NetworkManager
, переопределить метод buildConnection
и добавить переменную экземпляра плюс метод доступа для созданного соединения. Это похоже на большой код.
Как бы вы решили это? Я ищу решение, которое поддерживает дизайн класса NetworkManager
в чистоте и не требует большого количества магии или кода в тесте.