Я пытаюсь проверить, как мое приложение реагирует на различные конфигурации 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)
}
}
Однако, я никогда не получу успешную инициализацию с фиктивным объектом, который соответствует моему протоколу.Как мне решить эту проблему, чтобы я мог проверить?