SlideShare a Scribd company logo
Unit тестирование iOS приложений
Андрей Волобуев
Что такое unit тесты
Для чего тестировать
Когда тестировать
Виды unit тестов
Двойники для тестов
Управление зависимостями
Лучшие практики
Тезисы
Что такое unit тесты ?
Модульное тестирование, или юнит-тестирование (англ.
unit testing) — процесс в программировании, позволяющий
проверить на корректность отдельные модули исходного
кода программы.
Википедия
Что такое unit тесты ?
Класс Тест класс
Метод 1
Метод 2
Тест метод 1.2
Тест метод 2.1
Тест метод 1.1
.
.
.
Для чего тестировать ?
Уверенность в корректности работы программы
Возможность рефакторинга
Исполняемая документация
Исполняемые требования
Работа с CI системами
Доказательство что баг исправлен
Когда тестировать ?
TDD - сначала пишется тест
Refactor
Red
Green
Когда тестировать ?
Обычное тестирование - тесты пишутся после кода
Когда тестировать
Вопрос в том насколько после
Виды unit тестов
Возвращаемый результат
Состояние
Поведение
Двойники для тестов
Клиент Официант Повар
Ресторан
Двойники для тестов
Клиент Официант Тест повар
Ресторан
Двойники для тестов
Stub - возвращают заранее предопределенный результат
Mock - содержат логику для проверки поведения
Управление зависимостями
Dependency injection
// Менеджер ресторана должен сказать нам какой стол свободен
struct Manager{
// Он обращается к сервису реализующему протокол
var tablesService: FreeTableProvider
func getFreeTable() -> Int{
let tableId = tablesService.getTable()
return tableId
}
// Constructor injection
init(tablesService: FreeTableProvider = ProductionTableProvider()){
self.tablesService = tablesService
}
}
// Протокол для сервиса
protocol FreeTableProvider{
func getTable() -> Int
}
struct ProductionTableProvider: FreeTableProvider{
func getTable() -> Int {
let tableId = makeLongRunningRequestAndReturnTable()
return tableId
}
private func makeLongRunningRequestAndReturnTable() -> Int { . . . }
}
class StubFreeTableProvider: FreeTableProvider{
func getTable() -> Int { return 42 }
}
class ManagerTests: XCTestCase {
override func setUp() {
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testManagerRetunsFreeTable(){
let stubFreeTableProvider = StubFreeTableProvider()
let manager = Manager(tablesService: stubFreeTableProvider)
let tableId = manager.getFreeTable()
XCTAssertEqual(tableId, 42, "Менеджер возвращает столик полученный от сервиса")
}
}
protocol OrderExecutor{
func executeOrder()
}
// Теперь мы тестируем внутреннее состояние официанта
struct Waiter{
// Столик с которым работает официант
var currentTableId: Int?
var cook: OrderExecutor
func excecuteOrder(){
cook.executeOrder()
}
// Функция позвать официанта к столику
mutating func call(toTable tableId: Int){
currentTableId = tableId
}
init(orderExecutor: OrderExecutor){
self.cook = orderExecutor
}
}
class WaiterUnitTests: XCTestCase {
override func setUp() {
super.setUp()
}
override func tearDown() {
super.tearDown()
}
func testWaiterServesTableAfterCalling(){
var waiter = Waiter()
let tableId = 42
waiter.call(toTable: tableId)
XCTAssertEqual(tableId, waiter.currentTableId, "Официанта приходит к столику")
}
}
// Тот кто реализует этот протокол может исполнять заказы
protocol OrderExecutor{
func executeOrder()
}
// Теперь поведение официанта
struct Waiter{
var currentTableId: Int?
// Тот кто реализует этот протокол может исполнять заказы
var cook: OrderExecutor
// Функция передать заказ повару
func excecuteOrder(){
cook.executeOrder()
}
mutating func call(toTable tableId: Int){
currentTableId = tableId
}
// Constructor injection
init(orderExecutor: OrderExecutor = ProductionOrderExecutor()){
self.cook = orderExecutor
}
}
class MockCook: OrderExecutor{
var isOrederExecuted = false
func executeOrder() {
isOrederExecuted = true
}
}
class WaiterUnitTests: XCTestCase {
func testWaiterGivesOrderToCook(){
let mockCook = MockCook()
let waiter = Waiter(orderExecutor: mockCook)
waiter.excecuteOrder()
XCTAssertTrue(mockCook.isOrederExecuted, "Официант отдал заказ повару”)
}
}
Лучшие практики
DRY
if, switch, for, while
Сложные setUp
Вычисляемые ожидаемые значения
Много assert на тест
Мало тестов
Много тестов
ВОПРОСЫ?

More Related Content

What's hot

автоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumvyacheslavmaslov
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverИлья Кожухов
 
Автоматизация и Selenium IDE
Автоматизация и Selenium IDEАвтоматизация и Selenium IDE
Автоматизация и Selenium IDEISsoft
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectakrakovetsky
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgIT61
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoIlya Shalyapin
 
Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.MageCloud
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"QA Dnepropetrovsk Community (Ukraine)
 
автоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumvyacheslavmaslov
 
Unit tests final
Unit tests finalUnit tests final
Unit tests finalcorehard_by
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with SeleniumSergey Shvets
 
Учим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestУчим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestRina Uzhevko
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiMichael Chernobrov
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneCodeFest
 
JMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладSQALab
 
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья СтусьПолный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья СтусьMail.ru Group
 
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...sqadays8
 

What's hot (18)

автоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Selenium
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
Автоматизация и Selenium IDE
Автоматизация и Selenium IDEАвтоматизация и Selenium IDE
Автоматизация и Selenium IDE
 
Dependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInjectDependency Injection на примере Unity и NInject
Dependency Injection на примере Unity и NInject
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
 
Pycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и DjangoPycon Russia 2013 - Разработка через тестирование в Python и Django
Pycon Russia 2013 - Разработка через тестирование в Python и Django
 
Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.Модульное тестирование iOS-приложений.
Модульное тестирование iOS-приложений.
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
 
автоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Seleniumавтоматизация тестирования с помощью Selenium
автоматизация тестирования с помощью Selenium
 
Unit tests final
Unit tests finalUnit tests final
Unit tests final
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
 
Учим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTestУчим автотесты человеческому языку с помощью Allure и PyTest
Учим автотесты человеческому языку с помощью Allure и PyTest
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
Selenium vs AJAX
Selenium vs AJAXSelenium vs AJAX
Selenium vs AJAX
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
JMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский доклад
 
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья СтусьПолный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь
 
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
 

Similar to Unit testing iOS Applications

Руководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumUladzimir Kryvenka
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAndrey Rebrov
 
Dependency injection на примере unity и n inject
Dependency injection на примере unity и n injectDependency injection на примере unity и n inject
Dependency injection на примере unity и n injectRoman Kalita
 
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван ЗахарченкоSolit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченкоsolit
 
Unit tests Python examples
Unit tests Python examplesUnit tests Python examples
Unit tests Python examplesssuserd327fe1
 
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...Tech Talks @NSU
 
Simonova sql server-enginetesting
Simonova sql server-enginetestingSimonova sql server-enginetesting
Simonova sql server-enginetestingLiloSEA
 
Simonova CSEDays
Simonova CSEDaysSimonova CSEDays
Simonova CSEDaysLiloSEA
 
Katerina Simonova CSEDays
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDaysLiloSEA
 
Katerina Simonova CSEDays
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDaysLiloSEA
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDDAleksei Alekseev
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Маргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной командыМаргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной командыSQALab
 
Тестирование производительности систем мониторинга на платформе Microsoft SCO...
Тестирование производительности систем мониторинга на платформе Microsoft SCO...Тестирование производительности систем мониторинга на платформе Microsoft SCO...
Тестирование производительности систем мониторинга на платформе Microsoft SCO...SQALab
 
JUnit, дай пять!
JUnit, дай пять!JUnit, дай пять!
JUnit, дай пять!Dmitrii Tuchs
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Unit testing
Unit testingUnit testing
Unit testingISsoft
 
Контроль качества с использованием продуктов Ibm rational
Контроль качества с использованием продуктов Ibm rationalКонтроль качества с использованием продуктов Ibm rational
Контроль качества с использованием продуктов Ibm rationalAlexander Novichkov
 

Similar to Unit testing iOS Applications (20)

Simonova sql server-enginetesting
Simonova sql server-enginetestingSimonova sql server-enginetesting
Simonova sql server-enginetesting
 
Руководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из SeleniumРуководство по приготовлению бутербродов из Selenium
Руководство по приготовлению бутербродов из Selenium
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
 
Dependency injection на примере unity и n inject
Dependency injection на примере unity и n injectDependency injection на примере unity и n inject
Dependency injection на примере unity и n inject
 
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван ЗахарченкоSolit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
 
Unit tests Python examples
Unit tests Python examplesUnit tests Python examples
Unit tests Python examples
 
Unit тесты java
Unit тесты javaUnit тесты java
Unit тесты java
 
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
 
Simonova sql server-enginetesting
Simonova sql server-enginetestingSimonova sql server-enginetesting
Simonova sql server-enginetesting
 
Simonova CSEDays
Simonova CSEDaysSimonova CSEDays
Simonova CSEDays
 
Katerina Simonova CSEDays
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDays
 
Katerina Simonova CSEDays
Katerina Simonova CSEDaysKaterina Simonova CSEDays
Katerina Simonova CSEDays
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Маргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной командыМаргарита Сафарова - Аудит процессов тестирования при смене проектной команды
Маргарита Сафарова - Аудит процессов тестирования при смене проектной команды
 
Тестирование производительности систем мониторинга на платформе Microsoft SCO...
Тестирование производительности систем мониторинга на платформе Microsoft SCO...Тестирование производительности систем мониторинга на платформе Microsoft SCO...
Тестирование производительности систем мониторинга на платформе Microsoft SCO...
 
JUnit, дай пять!
JUnit, дай пять!JUnit, дай пять!
JUnit, дай пять!
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Unit testing
Unit testingUnit testing
Unit testing
 
Контроль качества с использованием продуктов Ibm rational
Контроль качества с использованием продуктов Ibm rationalКонтроль качества с использованием продуктов Ibm rational
Контроль качества с использованием продуктов Ibm rational
 

More from Andrey Volobuev

Prompt engineering for iOS developers (How LLMs and GenAI work)
Prompt engineering for iOS developers (How LLMs and GenAI work)Prompt engineering for iOS developers (How LLMs and GenAI work)
Prompt engineering for iOS developers (How LLMs and GenAI work)Andrey Volobuev
 
Protocols and generics in Swift
Protocols and generics in SwiftProtocols and generics in Swift
Protocols and generics in SwiftAndrey Volobuev
 
Архитектура компилятора Swift
Архитектура компилятора SwiftАрхитектура компилятора Swift
Архитектура компилятора SwiftAndrey Volobuev
 
Преимущества и недостатки языка Swift
Преимущества и недостатки языка SwiftПреимущества и недостатки языка Swift
Преимущества и недостатки языка SwiftAndrey Volobuev
 

More from Andrey Volobuev (9)

Prompt engineering for iOS developers (How LLMs and GenAI work)
Prompt engineering for iOS developers (How LLMs and GenAI work)Prompt engineering for iOS developers (How LLMs and GenAI work)
Prompt engineering for iOS developers (How LLMs and GenAI work)
 
Protocols and generics in Swift
Protocols and generics in SwiftProtocols and generics in Swift
Protocols and generics in Swift
 
State machines in iOS
State machines in iOSState machines in iOS
State machines in iOS
 
ML
MLML
ML
 
Mobile architectures
Mobile architecturesMobile architectures
Mobile architectures
 
Functional
FunctionalFunctional
Functional
 
How React works
How React works How React works
How React works
 
Архитектура компилятора Swift
Архитектура компилятора SwiftАрхитектура компилятора Swift
Архитектура компилятора Swift
 
Преимущества и недостатки языка Swift
Преимущества и недостатки языка SwiftПреимущества и недостатки языка Swift
Преимущества и недостатки языка Swift
 

Unit testing iOS Applications

  • 1. Unit тестирование iOS приложений Андрей Волобуев
  • 2. Что такое unit тесты Для чего тестировать Когда тестировать Виды unit тестов Двойники для тестов Управление зависимостями Лучшие практики Тезисы
  • 3. Что такое unit тесты ? Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Википедия
  • 4. Что такое unit тесты ? Класс Тест класс Метод 1 Метод 2 Тест метод 1.2 Тест метод 2.1 Тест метод 1.1 . . .
  • 5. Для чего тестировать ? Уверенность в корректности работы программы Возможность рефакторинга Исполняемая документация Исполняемые требования Работа с CI системами Доказательство что баг исправлен
  • 6. Когда тестировать ? TDD - сначала пишется тест Refactor Red Green
  • 7. Когда тестировать ? Обычное тестирование - тесты пишутся после кода
  • 8. Когда тестировать Вопрос в том насколько после
  • 9. Виды unit тестов Возвращаемый результат Состояние Поведение
  • 10. Двойники для тестов Клиент Официант Повар Ресторан
  • 11. Двойники для тестов Клиент Официант Тест повар Ресторан
  • 12. Двойники для тестов Stub - возвращают заранее предопределенный результат Mock - содержат логику для проверки поведения
  • 14. // Менеджер ресторана должен сказать нам какой стол свободен struct Manager{ // Он обращается к сервису реализующему протокол var tablesService: FreeTableProvider func getFreeTable() -> Int{ let tableId = tablesService.getTable() return tableId } // Constructor injection init(tablesService: FreeTableProvider = ProductionTableProvider()){ self.tablesService = tablesService } } // Протокол для сервиса protocol FreeTableProvider{ func getTable() -> Int } struct ProductionTableProvider: FreeTableProvider{ func getTable() -> Int { let tableId = makeLongRunningRequestAndReturnTable() return tableId } private func makeLongRunningRequestAndReturnTable() -> Int { . . . } }
  • 15. class StubFreeTableProvider: FreeTableProvider{ func getTable() -> Int { return 42 } } class ManagerTests: XCTestCase { override func setUp() { super.setUp() } override func tearDown() { super.tearDown() } func testManagerRetunsFreeTable(){ let stubFreeTableProvider = StubFreeTableProvider() let manager = Manager(tablesService: stubFreeTableProvider) let tableId = manager.getFreeTable() XCTAssertEqual(tableId, 42, "Менеджер возвращает столик полученный от сервиса") } }
  • 16. protocol OrderExecutor{ func executeOrder() } // Теперь мы тестируем внутреннее состояние официанта struct Waiter{ // Столик с которым работает официант var currentTableId: Int? var cook: OrderExecutor func excecuteOrder(){ cook.executeOrder() } // Функция позвать официанта к столику mutating func call(toTable tableId: Int){ currentTableId = tableId } init(orderExecutor: OrderExecutor){ self.cook = orderExecutor } }
  • 17. class WaiterUnitTests: XCTestCase { override func setUp() { super.setUp() } override func tearDown() { super.tearDown() } func testWaiterServesTableAfterCalling(){ var waiter = Waiter() let tableId = 42 waiter.call(toTable: tableId) XCTAssertEqual(tableId, waiter.currentTableId, "Официанта приходит к столику") } }
  • 18. // Тот кто реализует этот протокол может исполнять заказы protocol OrderExecutor{ func executeOrder() } // Теперь поведение официанта struct Waiter{ var currentTableId: Int? // Тот кто реализует этот протокол может исполнять заказы var cook: OrderExecutor // Функция передать заказ повару func excecuteOrder(){ cook.executeOrder() } mutating func call(toTable tableId: Int){ currentTableId = tableId } // Constructor injection init(orderExecutor: OrderExecutor = ProductionOrderExecutor()){ self.cook = orderExecutor } }
  • 19. class MockCook: OrderExecutor{ var isOrederExecuted = false func executeOrder() { isOrederExecuted = true } } class WaiterUnitTests: XCTestCase { func testWaiterGivesOrderToCook(){ let mockCook = MockCook() let waiter = Waiter(orderExecutor: mockCook) waiter.excecuteOrder() XCTAssertTrue(mockCook.isOrederExecuted, "Официант отдал заказ повару”) } }
  • 20. Лучшие практики DRY if, switch, for, while Сложные setUp Вычисляемые ожидаемые значения Много assert на тест Мало тестов Много тестов