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.