Я пытаюсь добавить расширение для зависимости в целях тестирования.Зависимость - это класс, помеченный как final, и я хотел бы создать протокол, имитирующий интерфейс, чтобы я мог поменять реальную реализацию на фиктивный объект в моих тестах.В настоящее время я получаю ошибку прерывания прерывания 6 при построении моих тестов, если расширение включено в мой проект.Без расширения проект создается без ошибок, но я не могу передать свою зависимость в качестве протокола, который не позволяет мне заменять его на фиктивный объект в моих тестах.Поскольку класс помечен как окончательный, я не могу подклассифицировать объект, чтобы добавить к нему свой протокол.
Я добавил 3 объекта, чтобы разрешить такое поведение:
RealmProtocol.swift : это протокол, имитирующий открытый интерфейс объекта Realm (моя внешняя зависимость, но это не относится к Realm).
import RealmSwift
protocol RealmProtocol {
func add(_ object: Object, update: Bool)
func beginWrite()
func commitWrite(withoutNotifying tokens: [NotificationToken]) throws
func object<Element: Object, KeyType>(ofType type: Element.Type, forPrimaryKey key: KeyType) -> Element?
func objects<Element: Object>(_ type: Element.Type) -> Results<Element>
}
MockRealm.swift : этомой фиктивный объект для Realm.swift.В производстве будет использоваться объект Realm, в моих тестах он будет заменен MockRealm, поэтому я могу убедиться, что правильный метод вызывается в нужное время.
import Foundation
import RealmSwift
@testable import RealmObjectMocking
class MockRealm: RealmProtocol {
var addCalled = false
var beginWriteCalled = false
var commitWriteCalled = false
var objectCalled = false
var objectsCalled = false
var objectReturn: Any?
func add(_ object: Object, update: Bool) {
addCalled = true
}
func beginWrite() {
beginWriteCalled = true
}
func commitWrite(withoutNotifying tokens: [NotificationToken]) throws {
commitWriteCalled = true
}
func object<Element: Object, KeyType>(ofType type: Element.Type, forPrimaryKey key: KeyType) -> Element? {
objectCalled = true
let object = objectReturn as? Element
return object
}
func objects<Element: Object>(_ type: Element.Type) -> Results<Element> {
objectsCalled = true
let realm = try! Realm()
return realm.objects(type)
}
}
Realm.swift : Это расширение объекта Realm, чтобы оно соответствовало моему протоколу.Без этого файла в проекте он строит без ошибок.С учетом этого я получаю прерывание прерывания 6. Реализация пуста, так как мой протокол соответствует существующим публичным методам объекта Realm.
import RealmSwift
extension Realm: RealmProtocol {}
Я не уверен, является ли это проблемой с расширениемкласс, помеченный как final, или если я получаю какую-то круговую зависимость здесь, или, может быть, другую проблему.Многие посты рекомендовали отключить оптимизацию, чтобы обойти эту ошибку, но это не помогло.Кроме того, открытие файла MockRealm.swift, когда расширение класса включено в проект, приводит к сбою редактора.Из-за этого я также подал Радар для этой проблемы.
Вот ссылка на пример проекта, который показывает проблему.Код в примере приложения идентичен приведенному выше коду: https://github.com/skladek/RealmObjectMocking