如果这段代码不适合编写测试代码,那么应该如何修改代码以编写测试用例?
class MyFileManager {
static let shared = MyFileManager()
func isStored(atPath path: String) -> Bool {
return FileManager.default.fileExists(atPath: path)
}
func readData(atPath path: String) -> Data? {
return try? Data(contentsOf: URL(fileURLWithPath: path))
}
}
class SomeViewModel {
func getCachedData() -> Data? {
let path = "xxxxx"
if MyFileManager.shared.isStored(atPath: path) {
return MyFileManager.shared.readData(atPath: path)
} else {
return nil
}
}
}
class TestSomeViewModel: XCTestCase {
func testGetCachedData() {
let viewModel = SomeViewModel()
// Need to cover SomeViewModel.getCachedData() method
}
}
isStored
,直接尝试读取它。如果文件不存在,那么try? Data(contentsOf:)
会返回nil
,这正好是你在未缓存时返回的内容。你可以消除一个方法,消除getCachedData
中的if
语句等。 - Robtry ?
是一种反模式。你应该使用func readData(atPath path: String) throws -> Data
。这样调用者就可以使用try ?
来忽略错误,但至少你没有将错误隐藏起来,如果他们需要的话,还可以获取到错误信息。 - Paulw11