InjectableLoggers
一组优秀的协议,有助于日志器实现松散耦合、可注入和可测试。
示例
要查看示例项目,请在您的终端运行以下命令
pod try InjectableLoggers
设置
只需添加
import InjectableLoggers
到需要可注入日志操作的文件中。
使日志器可注入
根据您想要(公开)多少从日志器中获取的功能,使日志器遵循以下协议之一
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
}
}
做一些日志记录
根据您的日志器遵循的协议,您可以调用以下方法
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)
额外好处!此库附带了两个具体的日志器 🎉
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
?
是的,设置有自己的CanLogMessage
实例(默认为ConsoleLogger
),用于记录所有创建的字符串。这不仅使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通过CocoaPods提供。要安装它,只需将以下行添加到您的Podfile中
pod 'InjectableLoggers'
许可证
InjectableLoggers可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。