如何伪造Realm结果进行测试

时间:2016-08-11 17:16:50

标签: swift unit-testing realm

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

  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...
    }
}

1 个答案:

答案 0 :(得分:3)

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

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

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)
    }
}