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