【发布时间】:2021-09-26 03:24:30
【问题描述】:
我正在尝试快速进行单元测试。我有一个名为MyFileManager 和SomeViewModel 的两类
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
}
}
}
我已经写了一个测试代码。我不确定这段代码是否会给我 100% 的代码覆盖率。这是单元测试
class LinePhoneTests: XCTestCase {
override func setUpWithError() throws {
testGetCachedData()
}
func testGetCachedData() {
let viewModel = SomeViewModel()
let data = viewModel.getCachedData()
XCTAssertFalse((data != nil))
XCTAssertTrue((data == nil))
}
}
如何获取代码覆盖率信息?
【问题讨论】:
-
@JoakimDanielson 我希望 SomeViewModel 类的代码覆盖率达到 100%。我怎样才能做到这一点?
-
与您的问题无关,但为什么不简单
XCTAssertNotNil(viewModel.getCachedData()) -
您的测试似乎正在尝试确保缓存正常工作。你应该以一种传达它的方式命名它。也许:
testThatDataIsCached(更多细节将是有益的) -
顺便说一句,“先检查后行动”的模式已经无法修复了。每当您在没有同步机制的情况下在两个单独的步骤中检查和操作时,您就有可能出现错误。在这种情况下,有可能在您检查
.isStored(atPath: path)然后通过执行.readData(atPath: path)做出反应的时间之间,其他东西可能已经从您的眼皮底下删除了该文件。您应该尝试阅读。如果文件不存在,只需捕获错误然后处理该情况。 -
您永远无法达到 100% 的代码覆盖率,尝试毫无意义。这是初学者单元测试人员最常见的错误之一。测试你认为应该测试的东西。使用覆盖率作为未测试的提示,并查看是否应该测试它,但不要尝试完全覆盖。有许多行甚至无法测试,例如
fatalError。此外,还有许多错误状态无法使用单元测试来模拟。
标签: ios swift unit-testing code-coverage