Testables
使私有属性可测试。
背景
假设有一个名为ProfileViewController
的类。这个类有一个属性username
,当新的值被赋值时,它会设置usernameLabel.text
。不幸的是,我们不能编写单元测试,因为usernameLabel
是一个私有属性。
ProfileViewController.swift
class ProfileViewController {
var username: String? {
didSet {
self.usernameLabel.text = self.username
}
}
private let usernameLabel = UILabel()
}
ProfileViewControllerTests.swift
// when
viewController.username = "devxoul"
// then
let usernameLabel = viewController.usernameLabel // 🚫 private
XCTAssertEqual(usernameLabel.text, "devxoul")
解决方案
Testables提供了一种使用Swift KeyPath暴露私有属性的方法。
将以下行添加到ProfileViewController.swift中
#if DEBUG
import Testables
extension ProfileViewController: Testable {
final class TestableKeys: TestableKey<Self> {
let usernameLabel = \Self.usernameLabel
}
}
#endif
并更新测试代码
// when
viewController.username = "devxoul"
// then
let usernameLabel = viewController.testables[\.usernameLabel] // ✅
XCTAssertEqual(usernameLabel.text, "devxoul")
许可证
Testables采用MIT许可证。有关更多信息,请参阅LICENSE文件。