Я бы хотел, чтобы блок тестировал класс, который действует как CBPeripheralManagerDelegate
классу CBPeripheralManager
. Как правило, для того, чтобы заглушить внешнюю зависимость класса, я бы использовал либо форму инъекции зависимости, проходя через инициализатор класса, либо через свойство. При работе с API на основе однопользовательских я могу использовать библиотеки, такие как Kiwi, чтобы заглушить метод уровня класса, который возвращает singleton (т. Е. [ClassName stub:@selector(sharedInstance) andReturn:myStubbedInstance]
). Проблема в случае издевательств CBPeripheralManager
заключается в том, что ее инициализатор принимает экземпляр делегата. Таким образом, любой код, который использует мой класс должен был бы сделать что-то вроде этого:Как один модуль тестирует код, который взаимодействует с базовыми API-интерфейсами Bluetooth?
PeripheralManagerWrapper *wrapper = [[PeripheralManagerWrapper alloc] init];
CBPeripheralManager *peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:wrapper queue:nil options:nil];
wrapper.peripheralManager = peripheralManager;
Тогда для модульного тестирования мой PeripheralManagerWrapper
класс, я мог бы просто создать его экземпляр и передать в издевался CBPeripheralManager
. Тем не менее, мне не нравится, если бы какой-либо вызывающий код моего объекта-обертки должен был пройти эту настройку. Есть ли лучший образец для решения этой ситуации? Я использовал оба Kiwi и OCMockito, но ни один из них не обеспечивает эту функциональность, возможно, затухание методов alloc
и init
CBPeripheralManager
, а затем просто создает экземпляр экземпляра в инициализаторе .
Да, обертка не была посвящена тестированию, но больше для изоляции поведения Bluetooth от ViewController. Упаковщик, возможно, не был лучшим суффиксом. –
Хорошо. Всегда хорошая практика отделить вашу бизнес-логику от сторонних API. Отвечал ли я на ваш вопрос? – allprog
Да, извините за то, что не отметили это как таковое! –