Я пытаюсь использовать OCMock
, чтобы изменить поведение селектора экземпляра для указанного класса c, где у меня нет прямого указателя на экземпляр рассматриваемого класса.
Я нашел несколько сообщений в Интернете, которые утверждают, что позволяют делать хотя бы часть этого, например: Как смоделировать объект с OCMock, который не передается в качестве параметра методу?
Я пытался следовать указаниям в одном из ответов в этом посте, особенно полагаясь на код, подобный следующему:
id mockController = OCMClassMock([WebAuthViewController class]);
OCMStub([mockController alloc]).andReturn(mockController);
OCMStub([mockController initWithAuthenticationToken:OCMOCK_ANY authConfig:OCMOCK_ANY]).andReturn(mockController);
Однако у меня возникают трудности с пониманием этого кода. Прежде всего, где работает собственно логика "alloc
" c? Кажется, код говорит «mock allo c и возвращает существующий метод класса», но alloc
должен возвращать экземпляр, а не класс. Это какая-то магия c, встроенная в OCMock
?
Кроме того, по смежным вопросам кажется, что init просто возвращает тот же mocked класс, а не экземпляр этого класса. Кажется действительно странным, что это возвращает то же самое, что и предыдущий макет, и я не понимаю, где вызывается собственно пользовательский лог инициализации c. Похоже, что он полностью опущен, поскольку нигде нет вызова .andForwardToRealObject()
.
Однако, в конечном счете, моя главная проблема в том, что я не понимаю, как смоделировать метод экземпляра с использованием приведенного выше кода, поскольку все работает над класс, а не экземпляр. Я пытался написать аналогичный макет, чтобы изменить поведение метода экземпляра (используя эквивалент mockController
выше), но там говорилось, что метода не было.
Я пробовал кучу вещей, но мог не заставить OCMock разобраться с этим делом. Если кто-то может указать мне на пример, который высмеивает конкретный c метод экземпляра для всех экземпляров класса, я был бы признателен за это.
Кстати, я смог заставить вещи работать, используя swizzling без какого-либо использования OCMock
, но это кажется действительно хакерским (особенно когда я использую OCMock
для всего остального), поэтому я хотел бы, чтобы это работало с OCMock
.