Использование OCMock для моделирования внутреннего объекта и изменения поведения селектора экземпляра - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь использовать 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.

...