InjectableLoggers 2.1.1

InjectableLoggers 2.1.1

Menno Lovink维护。



InjectableLoggers

Version Platform License

一组优秀的协议,有助于日志器实现松散耦合、可注入和可测试。

示例

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

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