我正在使用 realm-cocoa对于我的持久层。有一个类取决于 realm
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
的模拟版本并将其注入(inject) RealmMetaData
使用 Constructor Injection 的实例.
在实现模拟 RealmInterface
时,我发现很难模拟 objects
函数返回一个空列表。因为函数签名的返回类型Results<T>
是 Realm Framework 提供的类型并且没有可用的空构造函数。这就是我卡住的地方。
那个Result<T>
是一个类 final
关键字,所以我也不能将它子类化以使用它的私有(private)方法来获取空集合。
提前致谢!
最佳答案
正如我在评论中所建议的那样,您可以在测试类中使用内部内存 Realm 并转发所有返回 Result<T>
的方法。
关于swift - 如何在 swift 中模拟 realm-cocoa,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38952935/