final class Cache<T>: CacheProtocol {

Тест ожидает запись, чтение и удаление по nil. В показанном Cache отсутствуют storage и setValue; fetchValue вызывает completion синхронно.

Короткий ответ

Что ответить на собеседовании

Тест ожидает запись, чтение и удаление по nil. В показанном Cache отсутствуют storage и setValue; fetchValue вызывает completion синхронно.

Подробный разбор

Ответ с пояснениями

Условие

final class Cache<T>: CacheProtocol { func getValue(forKey key: String) -> T? { return storage[key] } func fetchValue(forKey key: String, completion: @escaping (T?) -> Void) { let value = storage[key] completion(value) } }

final class CacheTests: XCTestCase { override func setUp() { super.setUp() }

func testSetAndGetValue() {
    let cache = Cache<String>()
    let key: String = "key"
    let value: String = "value"

    cache.setValue(value, forKey: key)
    XCTAssertEqual(cache.getValue(forKey: key), value)

    cache.setValue(nil, forKey: key)
    XCTAssertTrue(cache.getValue(forKey: key) == nil)
}

func testCompletion() {
}

}

CacheTests.defaultTestSuite.run()

Ответ

Тест ожидает запись, чтение и удаление по nil. В показанном Cache отсутствуют storage и setValue; fetchValue вызывает completion синхронно.

Для приведённого теста недостающая часть класса может выглядеть так:

private var storage: [String: T] = [:]

func setValue(_ value: T?, forKey key: String) {
    storage[key] = value
}

Присваивание nil удаляет значение. В testCompletion запишите строку, вызовите fetchValue и проверьте аргумент замыкания через XCTAssertEqual; отдельно проверьте отсутствующий ключ. Здесь callback вызывается до возврата из метода: @escaping не делает операцию асинхронной. Полного CacheProtocol в условии нет, поэтому совпадение имён методов с его требованиями нужно проверить отдельно. Общий словарь не защищён от одновременного доступа.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее