Ответ
Нет, mock-объекты нужны не для всех тестов. Они используются для изоляции тестируемого модуля от его внешних зависимостей (сеть, база данных, файловая система, сложные сервисы).
Когда моки НЕ нужны:
- При тестировании pure-функций (детерминированных, без побочных эффектов).
- Для простой логики, не зависящей от других объектов.
Пример теста без мока:
// Pure-функция, тестируется без моков.
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
func testAddition() {
let result = add(2, 2)
XCTAssertEqual(result, 4)
}
Когда моки НУЖНЫ:
- Зависимости медленные или нестабильные (сетевые запросы, доступ к БД).
- Нужно проверить взаимодействие (например, был ли вызван метод сервиса с правильными параметрами).
- Зависимости имеют сложное состояние или побочные эффекты, которые трудно воспроизвести в тесте.
- Тестирование сценариев ошибок, которые сложно вызвать у реальной зависимости.
Пример использования мока для сетевого сервиса:
protocol NetworkServiceProtocol {
func fetchData(completion: (Data?) -> Void)
}
class MockNetworkService: NetworkServiceProtocol {
var simulatedData: Data?
var wasCalled = false
func fetchData(completion: (Data?) -> Void) {
wasCalled = true // Проверяем факт вызова
completion(simulatedData) // Подменяем ответ
}
}
// В тесте инжектим мок вместо реального сервиса.
let mockService = MockNetworkService()
mockService.simulatedData = Data()
let sut = ViewModel(networkService: mockService)
sut.loadData()
XCTAssertTrue(mockService.wasCalled)