Как заблокировать метод класса в OCMock?

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

36
задан Jeremy 27 November 2009 в 18:12
поделиться

2 ответа

Исходя из мира Ruby, я точно понимаю, чего вы пытаетесь достичь. По-видимому, вы буквально на три часа опередили меня, пытаясь сделать то же самое сегодня (часовой пояс?: -).

В любом случае, я полагаю , что это не поддерживается в том виде, в котором можно было бы desire в OCMock, потому что заглушка метода класса должна буквально проникать в класс и изменять его реализацию независимо от того, когда, где и кто вызывает метод. Это контрастирует с тем, что, по-видимому, делает OCMock, а именно предоставляет вам прокси-объект, которым вы манипулируете или с которым иным образом оперируете напрямую, вместо «реального» объекта указанного класса.

Например, кажется разумным хотите заглушить NSURLConnection + sendSynchronousRequest: returnResponse: error: method. Однако типично, что использование этого вызова в нашем коде несколько скрыто, поэтому очень неудобно параметризовать его и заменять имитацией объекта для класса NSURLConnection.

По этой причине я считаю, что "метод swizzling Обнаруженный вами подход, хотя и не очень привлекателен, это именно то, что вы хотите сделать для методов класса-заглушки. Сказать, что это очень громоздко, кажется чрезмерным - как насчет того, чтобы согласиться, что это "неизящно" и, может быть, не так удобен, как OCMock делает для нас жизнь. Тем не менее, это довольно краткое решение проблемы.

17
ответ дан 27 November 2019 в 05:42
поделиться

Если вы измените свой тестируемый метод, чтобы он принял параметр, который вводит класс NSURLConnection , то относительно легко передать имитацию, которая отвечает на данный селектор (возможно, вам придется создать фиктивный класс в своем тестовом модуле, который имеет селектор в качестве метода экземпляра, и имитировать этот класс). Без этой инъекции вы используете метод класса, в основном используя NSURLConnection (класс) как синглтон, и, следовательно, попали в анти-шаблон использования синглтон-объектов, и тестируемость вашего кода пострадала.

4
ответ дан 27 November 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: