OCMock и AFHTTPRequestOperationManager

Я пытаюсь создать макет для AFHTTPRequestOperationManager AFNetworking с помощью OCMock

Вот что у меня есть:

id mockRequestManager = OCMClassMock([AFHTTPRequestOperationManager class]);
OCMStub([mockRequestManager manager]).andReturn(mockRequestManager);
[myObject methodThatUsesAFHTTPRequestOperationManager];

Я сделал именно эту вещь раньше для других синглетонов ([NSNotificationCenter defaultCenter] например), но с AFHTTPRequestOperationManager я не получаю возвращаемый объект, когда [AFHTTPRequestOperationManager manager] вызывается из [myObject methodThatUsesAFHTTPRequestOperationManager], Я всегда получаю обратно объект экземпляра AFHTTPRequestOperationManager.

Я что-то пропустил? Есть ли какая-то деталь реализации AFHTTPRequestOperationManager, которая мешает этому работать?

РЕДАКТИРОВАТЬ

Итак, после просмотра кода AFHTTPRequestOperationManager выясняется, что на самом деле это не одноэлементный объект, а метод класса, который возвращает новый объект AFHTTPRequestOperationManager. Тем не менее, я до сих пор не понимаю, почему заглушка метода класса не возвращает мой фиктивный объект вместо создания нового.

1 ответ

Как вы говорите, не синглтон. Вы можете ввести его вместо этого; взгляните на этот ответ.

Использование инъекций предпочтительнее синглетонов. Если вы не хотите вводить типичные объекты, такие как [NSNotificationCenter defaultCenter] из [NSUserDefaults standardUserDefaults] то, что вы можете сделать вместо насмешки и заглушки средства доступа к общедоступному экземпляру, это просто использовать реальный объект в ваших тестах. Например, вместо того, чтобы тестировать, что вы публикуете определенное уведомление с издевательством над defaulCenter, вы можете прослушать это уведомление в своем тесте. Мне больше нравится это решение, поскольку оно не использует макеты, и мы можем сказать, что оно более надежно, поскольку вы тестируете свой объект в сочетании с реальным центром уведомлений. Некоторые люди могут сказать, что тогда тест будет интеграционным тестом, но IMO не стоит делать никаких различий в этом случае.

Что касается заглушения средства доступа к общему экземпляру, я не привык к новому синтаксису OCMock, но с этим не должно быть проблем, узнайте, как заглушить метод класса с помощью OCMock.

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