【问题标题】:How to fake Realm Results for tests如何伪造 Realm 结果以进行测试
【发布时间】:2016-08-11 17:16:50
【问题描述】:

我写了一个测试来验证一个函数是否被调用:

  func test_getTaskLists_doNotCreateOrUpdateTaskListToStorageWhenSynchedLocally() {

   ...    
    let (datasource, restAPI, fakeTaskListStorage) = ...

    datasource.getTaskLists() { (taskLists, error) -> Void in
      ...
      XCTAssertEqual(1, fakeTaskListStorage.readAllInvocationCount)
      ...      
    }
...
  }

该函数被模拟以绕过超级实现,问题是该函数返回一个我无法构建/模拟以返回有效对象的结果,因此编译器停止抱怨......我知道我可以只调用 super.readAll() 但在这里我实际上想将我的测试数据(fakeTaskLists)转换为一个假的 Result 对象,所以每个人都很高兴......不确定这是否可能

class FakeTaskListsStorageRealm : TaskListStorageRealm {
    var fakeTaskLists:[TaskList]?
    override func readAll() -> RealmSwift.Results<TaskList> {
      readAllInvocationCount += 1
      //Here I want to return fakeTaskLists somehow...
    }
}

【问题讨论】:

    标签: swift unit-testing realm


    【解决方案1】:

    没有办法直接实例化Results。子类化Results 也不允许。我认为最好的方法是通过像ResultsWrapper 这样的协议隐藏Results,而不是直接使用Results

    但一个简单的解决方法是在测试时使用内存中的领域。 FakeTaskListsStorageRealmreadAll() 可以使用内存中的 Realm 编写如下:

    class FakeTaskListsStorageRealm : TaskListStorageRealm {
        var fakeTaskLists:[TaskList]?
        override func readAll() -> RealmSwift.Results<TaskList> {
            readAllInvocationCount += 1
            return try! Realm(configuration: Realm.Configuration(inMemoryIdentifier: "test")).objects(TaskList.self)
        }
    }
    

    【讨论】:

    • 我有类似的包装器,并且可以确认这种方法是有效的——我用数组实现了包装器,所以我不使用内存中的领域。
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2016-10-09
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多