Тест ожидает запись, чтение и удаление по nil. В показанном Cache отсутствуют storage и setValue; fetchValue вызывает completion синхронно.
final class Cache<T>: CacheProtocol {
Тест ожидает запись, чтение и удаление по 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 в условии нет, поэтому совпадение имён методов с его требованиями нужно проверить отдельно. Общий словарь не защищён от одновременного доступа.