如何伪造Realm结果进行测试

Aka*_*sQc 5 unit-testing realm swift

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

  func test_getTaskLists_doNotCreateOrUpdateTaskListToStorageWhenSynchedLocally() {

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

    datasource.getTaskLists() { (taskLists, error) -> Void in
      ...
      XCTAssertEqual(1, fakeTaskListStorage.readAllInvocationCount)
      ...      
    }
...
  }
Run Code Online (Sandbox Code Playgroud)

该函数被模拟绕过超级实现,问题是该函数返回一个结果,我无法想出构建/模拟以返回一个有效的对象,所以编译器停止抱怨...我知道我可以调用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...
    }
}
Run Code Online (Sandbox Code Playgroud)

kis*_*umi 3

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

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

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)
    }
}
Run Code Online (Sandbox Code Playgroud)