1. Testable code &
architecture
Инженерные практики в iOS: Unit Tests
2. О нас
● Виталий Ружников
○ iOS-фрилансер
○ Руководитель разработки мобильных проектов
● Антон Катков
○ Тренер по инженерным практикам
○ Директор, руководитель проектов, iOS-
разработчик
3. Что значит testable?
● Testable - проверяемые
(c) Google translate
● Проверить можно что угодно
● Проверять должно быть удобно
10. Пример 1: c DI
@interface XPClassWithDI : NSObject {
XPDataSource *_datasource;
XPDelegate *_delegate;
XPService *_service;
}
- (id)initWithDelegate:(XPDelegate *)delegate datasource:
(XPDataSource *)datasource service:(XPService *)service;
@end
11. Пример 1: c DI
@implementation XPClassWithDI
- (id)initWithDelegate:(XPDelegate *)delegate datasource:
(XPDataSource *)datasource service:(XPService *)service {
_delegate = delegate;
_datasource = datasource;
_service = service;
return self;
}
@end
12. Пример 1: выводы
● Возможно переиспользование кода
● Удобно покрывать тестами за счёт
мокирования
● Легче изменяется логика поведения
● Класс более понятен без погружения в код
● Незначительно увеличилась сложность
написания
Исходный код здесь:
https://github.com/xp-party/ios-testability
13. Пример 2: функция с многими
аргументами
- (void)doSomethingWithObj1:(id)obj1
obj2:(id)obj2
fromDate:(NSDate *)fromDate
toDate:(NSDate *)toDate
forString1:(NSString *)string1
byString2:(NSString *)string2;
14. Практика 1: нетестируемый код
Исходники:
https://github.com/xp-party/teamgame-ios
Branch: original_code_to_test
Задача:
Написать тесты на метод:
- (void)consumeMessage:(NSDictionary *)
message;
15. Практика 2: тестируемый код
Исходники:
https://github.com/xp-party/teamgame-ios
Branch: refactored_code_to_test
Задача:
Написать тесты на метод:
- (void)consumeMessage:(NSDictionary *)
message;
16. Выводы
● Надо знать паттерны
● Необходимо использовать рефакторинг в
полной мере
● Нужно стремитесь к "Чистому Коду"
● Используйте TDD :)