私のパーシスタンス層にrealm-cocoaを使用しています。 realm
realm-cocoaを模擬する方法
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
}
に応じたクラスの一つは、その後、私のテストコードでは、私はRealmInterface
の嘲笑バージョンを書くことができますし、Constructor Injectionを使用してRealmMetaData
インスタンスに注入があります。
模擬したRealmInterface
を実装すると、空のリストを返すようにobjects
関数をモックするのは非常に難しいことがわかりました。ファンクションシグネチャResults<T>
の戻り値の型はRealm Frameworkによって提供される型であり、使用可能な空のコンストラクタは存在しないためです。ここで私は立ち往生している。
そのResult<T>
はfinal
キーワードのクラスですので、空のコレクションを取得するためのプライベートメソッドを使用するためにサブクラス化することもできません。
ありがとうございます!
まず、テストクラス内でメモリ内のRealmを保持して管理し、すべてのメソッドをそのクラスに転送することをお勧めします。 – Dmitry
@ドミトリーええ、助けてくれてありがとう。私はそれを受け入れることができます答えとしてこのコメントを書くだろうか? –