InjectableLoggers

Version Platform License

一套优秀的协议,可以帮助 logger(s) 实现松耦合、可注入和可测试。

示例

要查看示例项目,请在您的终端中运行以下命令

pod try InjectableLoggers

设置

只需添加

import InjectableLoggers

到需要可注入日志记录功能的的文件中。

使您的 logger 可注入

根据您希望从 logger (暴露) 多少功能,使 logger 遵循以下协议之一

CanLog

CanLogMessage

CanLogMessageAtLevel

所有这些协议都有轻量级和合理的默认实现,并确保您永远不必实现它们中的多个方法。

使现有的 logger 可注入

当它使用实例方法进行日志记录时

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 文件。