Макет AVCaptureDeviceInput для тестирования - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь проверить, как мое приложение реагирует на различные конфигурации AVFoundation.Я использую методы, описанные в видео WWDC ' Engineering for Testability .'

Я создал протокол для представления фрагментов AVCaptureDevice, которые использует мое приложение.

public protocol AVCaptureDeviceProperties: class {
    //MARK: Properties I use and need to test
    var position: AVCaptureDevice.Position { get }
    var focusMode: AVCaptureDevice.FocusMode { get set }
    var exposureMode: AVCaptureDevice.ExposureMode { get set }
    var whiteBalanceMode: AVCaptureDevice.WhiteBalanceMode { get set }
    //MARK: Functions I use use and need to test
    func lockForConfiguration() throws
    func unlockForConfiguration()
    func isFocusModeSupported(_ focusMode: AVCaptureDevice.FocusMode) -> Bool
    func isExposureModeSupported(_ exposureMode: AVCaptureDevice.ExposureMode) -> Bool
    func isWhiteBalanceModeSupported(_ whiteBalanceMode: AVCaptureDevice.WhiteBalanceMode) -> Bool
}

У меня есть расширение, которое заставляет AVCaptureDevice соответствовать моему протоколу.

extension AVCaptureDevice: AVCaptureDeviceProperties {
   //Don't need anything because AVCaptureDevice already has implementations of all the properties and functions I use.
}

Теперь я могу создать для себя объект, где я могу настроить все свойства для различных тестовых случаев.Отлично работает!

Однако мне нужно сделать еще один шаг и получить фиктивный AVCaptureDeviceInput объект.Этот объект имеет только один инициализатор, который принимает AVCaptureDevice, но я хочу иметь возможность инициализировать имитацию с моим типом протокола.Пока у меня есть это:

extension AVCaptureDeviceInput {
    convenience init?(device: AVCaptureDeviceProperties) throws {
        guard let downcast = device as? AVCaptureDevice else {
            return nil
        }
        try self.init(device: downcast)
    }
}

Однако, я никогда не получу успешную инициализацию с фиктивным объектом, который соответствует моему протоколу.Как мне решить эту проблему, чтобы я мог проверить?

...