zu verspotten Ich benutze realm-cocoa für meine Persistenz-Schicht. Es ist eine der Klassen in Abhängigkeit von realm
Wie Real-Kakao in Swift
class RealmMetaData : AbstractMetaData {
var realm: RealmInterface
var isFirstLaunch: Bool = false
init(realm: RealmInterface = try! Realm()) {
self.realm = realm
let results = realm.objects(MyClass.self)
self.isFirstLaunch = (results.count == 0)
if (self.isFirstLaunch) {
realm.write {
realm.add(MyClass())
}
}
}
// some code
}
protocol RealmInterface {
// using a protocol based approach of mocking
func objects<T: Object>(type: T.Type) -> Results<T>
func write(@noescape block: (() throws -> Void)) throws
func add(object: Object)
}
extension Realm: RealmInterface {
func add(object: Object) { self.add(object, update: false) }
// there is a method for Realm with signature: add(object:Object, update:Bool = false)
// but swift extension dose not permit default function parameter, hence the wrapping
}
Da ist in meinem Test-Code, ich verspottet Version von RealmInterface
schreiben kann und injizieren es in die RealmMetaData
Instanz mit Constructor Injection.
Bei der Umsetzung der verspotteten RealmInterface
, fand ich, dass es sehr schwierig ist, die objects
Funktion zu verspotten, um eine leere Liste zurückzugeben. Da der Rückgabetyp der Funktionssignatur Results<T>
ein Typ ist, der von Realm Framework bereitgestellt wird, und kein leerer Konstruktor verfügbar ist. Hier stecke ich fest.
Das Result<T>
ist eine Klasse mit final
Schlüsselwort, also kann ich es auch nicht ableiten, um seine privaten Methoden zu verwenden, um eine leere Sammlung zu holen.
Vielen Dank im Voraus!
Der erste Vorschlag, der Ihnen in den Sinn kommt, besteht darin, In-Memory-Realm in Ihrer Testklasse zu behalten und zu verwalten und all diese Methoden weiterzuleiten. – Dmitry
@Dmitry Ja, das hat geholfen, danke. Würden Sie diesen Kommentar als Antwort schreiben, dann kann ich das akzeptieren? –