一套优秀的协议,可以帮助 logger(s) 实现松耦合、可注入和可测试。
要查看示例项目,请在您的终端中运行以下命令
pod try InjectableLoggers
只需添加
import InjectableLoggers
到需要可注入日志记录功能的的文件中。
根据您希望从 logger (暴露) 多少功能,使 logger 遵循以下协议之一
CanLog
CanLogMessage
CanLogMessageAtLevel
所有这些协议都有轻量级和合理的默认实现,并确保您永远不必实现它们中的多个方法。
extension SomeoneElsesLogger: CanLogMessageAtLevel /* CanLog || CanLogMessage */ {
func log(_ message Any, at: LogLevel) {
//call existing logging functionality here
}
}
struct Logger: CanLogMessageAtLevel /* CanLog || CanLogMessage */ {
func log(_ message Any, at: LogLevel) {
//call existing logging functionality here
}
}
根据您的 loggers 遵循的协议,您可以调用以下方法
logger.log() //Will log "" to default LogLevel if expected
logger.log(42) //Will log 42 to default LogLevel if expected
logger.log("Something not to important", at LogLevel.verbose)
logger.log("Something broke!", at: LogLevel.error)
福利!这个库附带了两个具体的 loggers 🎉
ConsoleLogger
let logger: CanLogMessage = ConsoleLogger()
logger.log() // logs to console: ""
logger.log(42) // logs to console: 42
logger.log("Hi there") // logs to console: "Hi there"
Logger
let logger: CanLogMessageAtLevel = Logger(settings: .warningSettings)
logger.log("Some info", atLevel LogLevel.info) //Won't log anything because of settings
logger.log("Something's up") // logs to settings.destination: "⚠️ Something's up"
logger.log("Something went wrong") // logs to settings.destination: "⛔️ Something's up"
settings.destination
?
是的,settings 有它自己的 CanLogMessage
实例 (默认情况下为 ConsoleLogger
),用于记录所有创建的字符串。这不仅使 Logger
完全可测试(并经过测试),而且还允许您在需要时将日志记录到不同的目标。
另一个福利!这个库附带了一个非常方便的 mock logger,名为 MockLogger
🎉
class ViewControllerTests: XCTestCase {
var sut: ViewController!
var mockLogger: MockLogger!
override func setUp() {
super.setUp()
sut = ViewController()
mockLogger = MockLogger()
}
// MARK: Single line assertions
func testViewDidLoad() {
//Arrange
sut.logger = mockLogger //Inject mockLogger
//Act
sut.viewDidLoad()
//Assert
XCTAssertEqual(mockLogger.loggedMessages(at: Loglevel.info).last?.message as? String, "viewDidLoad()")
}
// MARK: More verbose assertions
func testDidReceiveMemoryWarning() {
//Arrange
sut.logger = mockLogger //Inject mockLogger
//Act
sut.didReceiveMemoryWarning()
//Assert
XCTAssertEqual(mockLogger.loggedMessages.last?.message as? String, "didReceiveMemoryWarning()")
XCTAssertEqual(mockLogger.loggedMessages.last?.level, Loglevel.warning)
}
}
有关更多高级测试,请查看示例项目。
InjectableLoggers 可通过 Swift Package Manager 获得。要安装它,只需使用此存储库的 URL 将其添加到您的项目中,如 此处 所述。
InjectableLoggers 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。