swift - 如何在 swift 中模拟 realm-cocoa

标签 swift unit-testing realm

我正在使用 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/

相关文章:

swift - 从 ENUM 函数中调用外部类函数

java - org.springframework.web.client.HttpClientErrorException : 400 null

android - Realm Kotlin - 删除 Realm 对象

ios - NavigationController 标题不会出现 swift/storyboard

ios - 如何使用 Firebase 创建好友列表?

swift - Realm 列名与 Swift 变量名

java - 单元测试应该使用绝对值吗?

unit-testing - 如何使用 JUnit 在 android 中对 Firestore 进行单元测试?

swift - 没有这样的模块

ios - iOS 8.3 中的调试 Realm