Я пытаюсь высмеять CMMotionManager для модульного тестирования. Вот мой сокращенный код:
protocol XMotionManager {
var isDeviceMotionAvailable: Bool { get }
var deviceMotionUpdateInterval: TimeInterval { get set }
}
extension CMMotionManager: XMotionManager {}
final class MockCMMotionManager: CMMotionManager {
private (set) var mockedIsDeviceMotionAvailable = true
override var isDeviceMotionAvailable: Bool {
mockedIsDeviceMotionAvailable
}
private var mockedDeviceMotionUpdateInterval: TimeInterval = 1.0
override var deviceMotionUpdateInterval: TimeInterval {
mockedDeviceMotionUpdateInterval
}
}
Содержимое протокола берется из API. MockCMMotionManager должен переопределить эти два свойства, чтобы их можно было установить по мере необходимости.
Хотя это работает для isDeviceMotionAvailable, я получаю следующую ошибку компиляции для deviceMotionUpdateInterval:
Cannot override mutable property with read-only property 'deviceMotionUpdateInterval'
Я не понимаю эту ошибку, потому что deviceMotionUpdateInterval не является свойством, доступным только для чтения, а объявлено как var.
Что-то не так с моим кодом?





deviceMotionUpdateInterval — свойство, доступное только для чтения, поскольку это вычисляемое свойство без установщика.
Вычисляемые свойства, у которых нет явного объявленного метода установки, имеют только неявный метод получения.
Ваше заявление о
override var deviceMotionUpdateInterval: TimeInterval {
mockedDeviceMotionUpdateInterval
}
эквивалентно этому:
override var deviceMotionUpdateInterval: TimeInterval {
get {
mockedDeviceMotionUpdateInterval
}
}
Чтобы устранить эту проблему, просто явно объявите методы получения и установки для вычисляемого свойства.
override var deviceMotionUpdateInterval: TimeInterval {
get {
mockedDeviceMotionUpdateInterval
}
set {
mockedDeviceMotionUpdateInterval = newValue
}
}